diff --git a/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/FormRequest.java b/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/FormRequest.java index e67fe36b..3d90d9da 100644 --- a/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/FormRequest.java +++ b/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/FormRequest.java @@ -17,8 +17,8 @@ import org.kymjs.kjframe.utils.KJLoger; -import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.util.Map; /** @@ -41,6 +41,7 @@ public FormRequest(int httpMethod, String url, HttpParams params, params = new HttpParams(); } this.mParams = params; + this.mParams.showAll(); } @Override @@ -67,14 +68,12 @@ public Map getHeaders() { } @Override - public byte[] getBody() { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); + public void buildbody(final OutputStream outstream) { try { - mParams.writeTo(bos); + mParams.writeTo(outstream); } catch (IOException e) { KJLoger.debug("FormRequest75--->IOException writing to ByteArrayOutputStream"); } - return bos.toByteArray(); } @Override diff --git a/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/HttpConnectStack.java b/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/HttpConnectStack.java index ee24aa42..27d0ece3 100755 --- a/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/HttpConnectStack.java +++ b/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/HttpConnectStack.java @@ -192,15 +192,15 @@ static void setConnectionParametersForRequest( */ private static void addBodyIfExists(HttpURLConnection connection, Request request) throws IOException { - byte[] body = request.getBody(); - if (body != null) { + connection.setDoOutput(true); + connection.setChunkedStreamingMode(1024);// connection.addRequestProperty(HEADER_CONTENT_TYPE, request.getBodyContentType()); DataOutputStream out = new DataOutputStream( connection.getOutputStream()); - out.write(body); + request.buildbody(out); out.close(); - } + } } diff --git a/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/HttpParams.java b/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/HttpParams.java index 526a3710..d364678b 100755 --- a/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/HttpParams.java +++ b/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/HttpParams.java @@ -36,6 +36,8 @@ import java.util.Random; import java.util.concurrent.ConcurrentHashMap; +import static android.R.attr.type; + /** * Http请求的参数集合 * @@ -71,10 +73,10 @@ public class HttpParams implements Serializable { private final byte[] BIT_ENCODING = "Content-Transfer-Encoding: 8bit\r\n\r\n" .getBytes(); - private final Map urlParams = new ConcurrentHashMap( + private final Map urlParams = new ConcurrentHashMap( 8); private final Map mHeaders = new HashMap(); - private final ByteArrayOutputStream mOutputStream = new ByteArrayOutputStream(); +// private final ByteArrayOutputStream outstream = new ByteArrayOutputStream(); private boolean hasFile; private String contentType = null; @@ -105,6 +107,9 @@ public void putHeaders(final String key, final String value) { mHeaders.put(key, value); } + public void put(final OutputStream outstream,final String key, final int value) { + this.put(outstream,key, value + ""); + } public void put(final String key, final int value) { this.put(key, value + ""); } @@ -113,13 +118,37 @@ public void putJsonParams(String json) { this.jsonParams = json; } + /** + * 添加文本参数 写入流 + */ + public void put(final OutputStream outstream,final String key, final String value) { +// urlParams.put(key, value); + writeToOutputStream(outstream,key, value.getBytes(), TYPE_TEXT_CHARSET, + BIT_ENCODING, ""); + } + + /** * 添加文本参数 */ public void put(final String key, final String value) { urlParams.put(key, value); - writeToOutputStream(key, value.getBytes(), TYPE_TEXT_CHARSET, - BIT_ENCODING, ""); + + } + + public void showAll(){ + for (String key : urlParams.keySet()) { + Log.v("HttpMap","key = " + key + "; value = " + urlParams.get(key)); + } + } + + /** + * 添加二进制参数, 例如Bitmap的字节流参数 写入流 + */ + public void put(final OutputStream outstream,String paramName, final byte[] rawData) { + hasFile = true; + writeToOutputStream(outstream,paramName, rawData, TYPE_OCTET_STREAM, + BINARY_ENCODING, "KJFrameFile"); } /** @@ -127,38 +156,73 @@ public void put(final String key, final String value) { */ public void put(String paramName, final byte[] rawData) { hasFile = true; - writeToOutputStream(paramName, rawData, TYPE_OCTET_STREAM, - BINARY_ENCODING, "KJFrameFile"); + urlParams.put(paramName, rawData); } /** - * 添加文件参数,可以实现文件上传功能 + * 添加文件参数,可以实现文件上传功能 写入流 */ - public void put(final String key, final File file) { + public void put(final OutputStream outstream,final String key, final File file) { + + hasFile = true; try { - hasFile = true; - writeToOutputStream(key, - FileUtils.input2byte(new FileInputStream(file)), - TYPE_OCTET_STREAM, BINARY_ENCODING, file.getName()); - } catch (FileNotFoundException e) { - Log.e("kjframe", "HttpParams.put()-> file not found"); + writeFirstBoundary(outstream); + outstream + .write((CONTENT_TYPE + type + NEW_LINE_STR).getBytes()); + outstream + .write(getContentDispositionBytes(key, file.getName())); + outstream.write(BINARY_ENCODING); + InputStream inStream=new FileInputStream(file); + + byte[] buffer = null; + long sum=0; + int len = 0; + byte[] b = new byte[1024]; + while ((len = inStream.read(b, 0, b.length)) != -1) { + System.out.println("写入到网络流"+":"+(sum+=len)); + outstream.write(b, 0, len); + } + inStream.close(); + outstream.write(NEW_LINE_STR.getBytes()); + } catch (final IOException e) { + e.printStackTrace(); } + + +// try { +// +// writeToOutputStream(key, +// FileUtils.input2byte(new FileInputStream(file)), +// TYPE_OCTET_STREAM, BINARY_ENCODING, file.getName()); +// } catch (FileNotFoundException e) { +// Log.e("kjframe", "HttpParams.put()-> file not found"); +// } + } + + + /** + * 添加文件参数,可以实现文件上传功能 + */ + public void put(final String key, final File file) { + + hasFile = true; + urlParams.put(key, file); } /** * 将数据写入到输出流中 */ - private void writeToOutputStream(String paramName, byte[] rawData, + private void writeToOutputStream(final OutputStream outstream,String paramName, byte[] rawData, String type, byte[] encodingBytes, String fileName) { try { - writeFirstBoundary(); - mOutputStream + writeFirstBoundary(outstream); + outstream .write((CONTENT_TYPE + type + NEW_LINE_STR).getBytes()); - mOutputStream + outstream .write(getContentDispositionBytes(paramName, fileName)); - mOutputStream.write(encodingBytes); - mOutputStream.write(rawData); - mOutputStream.write(NEW_LINE_STR.getBytes()); + outstream.write(encodingBytes); + outstream.write(rawData); + outstream.write(NEW_LINE_STR.getBytes()); } catch (final IOException e) { e.printStackTrace(); } @@ -169,8 +233,8 @@ private void writeToOutputStream(String paramName, byte[] rawData, * * @throws IOException */ - private void writeFirstBoundary() throws IOException { - mOutputStream.write(("--" + mBoundary + "\r\n").getBytes()); + private void writeFirstBoundary(final OutputStream outstream) throws IOException { + outstream.write(("--" + mBoundary + "\r\n").getBytes()); } private byte[] getContentDispositionBytes(String paramName, String fileName) { @@ -183,9 +247,9 @@ private byte[] getContentDispositionBytes(String paramName, String fileName) { return stringBuilder.append(NEW_LINE_STR).toString().getBytes(); } - public long getContentLength() { - return mOutputStream.toByteArray().length; - } +// public long getContentLength() { +// return outstream.toByteArray().length; +// } public String getContentType() { //如果contentType没有被自定义,且参数集包含文件,则使用有文件的contentType @@ -216,9 +280,21 @@ public void writeTo(final OutputStream outstream) throws IOException { // 参数最末尾的结束符 final String endString = "--" + mBoundary + "--\r\n"; // 写入结束符 - mOutputStream.write(endString.getBytes()); + for (ConcurrentHashMap.Entry entry : urlParams + .entrySet()) { + if(entry.getValue().getClass().getSimpleName().equals("String")){ + put(outstream,entry.getKey(),(String)entry.getValue()); + }else if(entry.getValue().getClass().getSimpleName().equals("File")){ + put(outstream,entry.getKey(),(File)entry.getValue()); + }else{ + put(outstream,entry.getKey(),(byte[]) entry.getValue()); + } + + } + + outstream.write(endString.getBytes()); // - outstream.write(mOutputStream.toByteArray()); +// outstream.write(outstream.toByteArray()); } else if (!StringUtils.isEmpty(getUrlParams())) { outstream.write(getUrlParams().substring(1).getBytes()); } @@ -232,24 +308,27 @@ public void consumeContent() throws IOException, } } - public InputStream getContent() { - return new ByteArrayInputStream(mOutputStream.toByteArray()); - } +// public InputStream getContent() { +// return new ByteArrayInputStream(outstream.toByteArray()); +// } public StringBuilder getUrlParams() { StringBuilder result = new StringBuilder(); boolean isFirst = true; - for (ConcurrentHashMap.Entry entry : urlParams + for (ConcurrentHashMap.Entry entry : urlParams .entrySet()) { - if (!isFirst) { - result.append("&"); - } else { - result.append("?"); - isFirst = false; + if(entry.getValue().getClass().getSimpleName().equals("String")){ + if (!isFirst) { + result.append("&"); + } else { + result.append("?"); + isFirst = false; + } + result.append(entry.getKey()); + result.append("="); + result.append(entry.getValue()); } - result.append(entry.getKey()); - result.append("="); - result.append(entry.getValue()); + } return result; } diff --git a/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/JsonRequest.java b/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/JsonRequest.java index d0b8db05..998e0ba3 100755 --- a/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/JsonRequest.java +++ b/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/JsonRequest.java @@ -72,15 +72,14 @@ public String getCacheKey() { } @Override - public byte[] getBody() { + public void buildbody(final OutputStream outstream) { try { - return mRequestBody == null ? null : mRequestBody - .getBytes(PROTOCOL_CHARSET); - } catch (UnsupportedEncodingException uee) { + outstream.write(mRequestBody == null ? null : mRequestBody + .getBytes(PROTOCOL_CHARSET)); + } catch (Exception uee) { KJLoger.debug( "Unsupported Encoding while trying to get the bytes of %s using %s", mRequestBody, PROTOCOL_CHARSET); - return null; } } } diff --git a/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/Request.java b/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/Request.java index 7cc162e2..23081f2f 100755 --- a/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/Request.java +++ b/KJFrame/kjframe/src/main/java/org/kymjs/kjframe/http/Request.java @@ -207,16 +207,15 @@ public String getBodyContentType() { return "application/x-www-form-urlencoded; charset=" + getParamsEncoding(); } - - /** - * 返回Http请求的body - */ - public byte[] getBody() { + public void buildbody(OutputStream out) { Map params = getParams(); if (params != null && params.size() > 0) { - return encodeParameters(params, getParamsEncoding()); + try { + out.write(encodeParameters(params, getParamsEncoding())); + } catch (IOException e) { + e.printStackTrace(); + } } - return null; } /**