android 用httpClient和HttpUrlConnection上傳文件

HttpClient上傳文件用到httpmime-4.1.3.jar,直接上代碼

String url = "http://192.168.2.12:8080/UploadFile/default/uploadFile.action";
MultipartEntity entity = new MultipartEntity();
FileBody body = new FileBody(new File("/mnt/sdcard/test2.apk"));
entity.addPart("file", body);
entity.addPart("fileFileName", new StringBody("test2.apk", Charset.forName("utf-8")));

HttpPost post = new HttpPost(url);
post.setEntity(entity);

HttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(post);
int stateCode = response.getStatusLine().getStatusCode();
if (stateCode == HttpStatus.SC_OK) {
	String result  = EntityUtils.toString(response.getEntity());
	System.out.println(result);
}

比較簡單,上傳大文件也沒什麼問題。

HttpUrlConnection上傳比較麻煩點,自己要構造出頭文件,這邊直接從網上copy的代碼,好想是誰的博客裏面的,如果有侵權啥的,私聊我,或者讓我刪除,都可以。代碼如下:

public class HttpUrlConnectionUploadFile {
	
	public static String post(String actionUrl, Map<String, String> params, Map<String, File> files) throws IOException {
        
		String BOUNDARY = java.util.UUID.randomUUID().toString();
		String PREFIX = "--", LINEND = "\r\n";
		String MULTIPART_FROM_DATA = "multipart/form-data";
		String CHARSET = "UTF-8";
        
		URL uri = new URL(actionUrl);
		HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
		conn.setChunkedStreamingMode(0);
		conn.setReadTimeout(5 * 1000);
		conn.setDoInput(true);
		conn.setDoOutput(true);
		conn.setUseCaches(false);
		conn.setRequestMethod("POST");
		conn.setRequestProperty("connection", "keep-alive");
		conn.setRequestProperty("Charsert", "UTF-8");
		conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);
        
		// 首先組拼文本類型的參數
		StringBuilder sb = new StringBuilder();
		for (Map.Entry<String, String> entry : params.entrySet()) {
			sb.append(PREFIX);
			sb.append(BOUNDARY);
			sb.append(LINEND);
			sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);
			sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
			sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
			sb.append(LINEND);
			sb.append(entry.getValue());
			sb.append(LINEND);
		}
        
		DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
		outStream.write(sb.toString().getBytes());
		// 發送文件數據
		if (files != null)
			for (Map.Entry<String, File> file : files.entrySet()) {
				StringBuilder sb1 = new StringBuilder();
				sb1.append(PREFIX);
				sb1.append(BOUNDARY);
				sb1.append(LINEND);
				sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getKey() + "\"" + LINEND);
				sb1.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINEND);
				sb1.append(LINEND);
				outStream.write(sb1.toString().getBytes());
                
				InputStream is = new FileInputStream(file.getValue());
				byte[] buffer = new byte[1024];
				int len = 0;
				while ((len = is.read(buffer)) != -1) {
					outStream.write(buffer, 0, len);
				}
                
				is.close();
				outStream.write(LINEND.getBytes());
			}
        
		// 請求結束標誌
		byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
		outStream.write(end_data);
		outStream.flush();
		// 得到響應碼
		int res = conn.getResponseCode();
		InputStream in = conn.getInputStream();
		if (res == 200) {
			int ch;
			StringBuilder sb2 = new StringBuilder();
			while ((ch = in.read()) != -1) {
				sb2.append((char) ch);
			}
		}
		outStream.close();
		conn.disconnect();
		return in.toString();
	}
}

conn.setChunkedStreamingMode(0);強調下,如果不加這句話,android上傳大文件的時候,容易出現內存溢出。

服務端我用的是struts2,和android關係不大,也沒什麼難度,代碼就不貼了。


還有就是用socket上傳了,http://blog.csdn.net/shimiso/article/details/8529633 這有高手寫好了,挺不錯的,推薦下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章