Multipart HTTP Requests

本文提供了一个Java实现的文件上传示例代码,通过使用HttpURLConnection进行multipart/form-data类型的POST请求来上传文件,并附带了如何将输入流转换为字符串的方法。
public String multipartRequest(String urlTo, String post, String filepath, String filefield) throws ParseException, IOException {
	HttpURLConnection connection = null;
	DataOutputStream outputStream = null;
	InputStream inputStream = null;
	
	String twoHyphens = "--";
	String boundary =  "*****"+Long.toString(System.currentTimeMillis())+"*****";
	String lineEnd = "\r\n";
	
	String result = "";
	
	int bytesRead, bytesAvailable, bufferSize;
	byte[] buffer;
	int maxBufferSize = 1*1024*1024;
	
	String[] q = filepath.split("/");
	int idx = q.length - 1;
	
	try {
		File file = new File(filepath);
		FileInputStream fileInputStream = new FileInputStream(file);
		
		URL url = new URL(urlTo);
		connection = (HttpURLConnection) url.openConnection();
		
		connection.setDoInput(true);
		connection.setDoOutput(true);
		connection.setUseCaches(false);
		
		connection.setRequestMethod("POST");
		connection.setRequestProperty("Connection", "Keep-Alive");
		connection.setRequestProperty("User-Agent", "Android Multipart HTTP Client 1.0");
		connection.setRequestProperty("Content-Type", "multipart/form-data; boundary="+boundary);
		
		outputStream = new DataOutputStream(connection.getOutputStream());
		outputStream.writeBytes(twoHyphens + boundary + lineEnd);
		outputStream.writeBytes("Content-Disposition: form-data; name=\"" + filefield + "\"; filename=\"" + q[idx] +"\"" + lineEnd);
		outputStream.writeBytes("Content-Type: image/jpeg" + lineEnd);
		outputStream.writeBytes("Content-Transfer-Encoding: binary" + lineEnd);
		outputStream.writeBytes(lineEnd);
		
		bytesAvailable = fileInputStream.available();
		bufferSize = Math.min(bytesAvailable, maxBufferSize);
		buffer = new byte[bufferSize];
		
		bytesRead = fileInputStream.read(buffer, 0, bufferSize);
		while(bytesRead > 0) {
			outputStream.write(buffer, 0, bufferSize);
			bytesAvailable = fileInputStream.available();
			bufferSize = Math.min(bytesAvailable, maxBufferSize);
			bytesRead = fileInputStream.read(buffer, 0, bufferSize);
		}
		
		outputStream.writeBytes(lineEnd);
		
		// Upload POST Data
		String[] posts = post.split("&");
		int max = posts.length;
		for(int i=0; i<max;i++) {
			outputStream.writeBytes(twoHyphens + boundary + lineEnd);
			String[] kv = posts[i].split("=");
			outputStream.writeBytes("Content-Disposition: form-data; name=\"" + kv[0] + "\"" + lineEnd);
			outputStream.writeBytes("Content-Type: text/plain"+lineEnd);
			outputStream.writeBytes(lineEnd);
			outputStream.writeBytes(kv[1]);
			outputStream.writeBytes(lineEnd);
		}
		
		outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
		
		inputStream = connection.getInputStream();
		result = this.convertStreamToString(inputStream);
		
		fileInputStream.close();
		inputStream.close();
		outputStream.flush();
		outputStream.close();
		
		return result;
	} catch(Exception e) {
		Log.e("MultipartRequest","Multipart Form Upload Error");
		e.printStackTrace();
		return "error";
	}
}

private String convertStreamToString(InputStream is) {
	BufferedReader reader = new BufferedReader(new InputStreamReader(is));
	StringBuilder sb = new StringBuilder();

	String line = null;
	try {
		while ((line = reader.readLine()) != null) {
			sb.append(line);
		}
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		try {
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	return sb.toString();
}
// see http://androidsnippets.com/multipart-http-requests



转载于:https://my.oschina.net/oppo4545/blog/195226

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值