摘要:Java 上传文件
这个方法是从网络上学来的
包装成自己使用的方法
大部分好像是用来写在Android手机上,Android手机使用RestApi上传文件时需要用到。(上传照片之类的)
我将一般字段的key,value及文件字段的key,value分开,分别使用data_map及file_map保存(类HashMap)
file_map则是control_name ,file_path 为key,value型式。
data_map则是control_name,control_value为key,value型式。
我使用的是HttpsURLConnection 做connection 连线上传。
Content-Type需设为"multipart/form-data; boundary = " + BOUNDARY
BOUNDARY是自定,这里定的是 "=================================="
用来分辨不同的control数据,一个区段为一个control 数据
每个区段开始以HYPHENS + BOUNDARY来分辨
HYPHENS= "--";
如果我传输两个control资讯到api的话(control_name,control_name2),file control 为file_control
则传输数据如下
--==================================
Content-isposition: form-data; name=control_name
control_value
--==================================
Content-isposition: form-data; name=control_name2
control_value2
--==================================
Content-isposition: form-data; name=file_control;filename=D:file.txt
Content-Type: text/plain
file_content
以下是Java Code Funtion ,并回传Responsepublic String post_file(String rest_api_url,HashMap data_map,HashMap file_map) throws Exception
{
String result = "";
try
{
final String BOUNDARY = "==================================";
final String HYPHENS = "--";
final String CRLF = "rn";
URL url = new URL(rest_api_url);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestProperty("Content-Type","multipart/form-data; boundary="+BOUNDARY);
DataOutputStream dataOS = new DataOutputStream(conn.getOutputStream());
//传数据
for(String key:data_map.keySet())
{
// 写--==================================
dataOS.writeBytes(HYPHENS+BOUNDARY+CRLF);
dataOS.writeBytes("Content-Disposition: form-data; name= ""+key+"""+CRLF);
dataOS.writeBytes(CRLF);
dataOS.writeBytes(data_map.get(key)+CRLF);
}
//传文件===============================================================================
for(String key:file_map.keySet())
{
FileInputStream fileInputStream = new FileInputStream(new File(file_map.get(key)));
// 写--==================================
dataOS.writeBytes(HYPHENS+BOUNDARY+CRLF);
dataOS.writeBytes("Content-Disposition: form-data; name=""+key+""; filename=""+file_map.get(key)+"""+CRLF); // 写(Disposition)
dataOS.writeBytes("Content-Type: text/plain"+CRLF); // 写(Content Type)
dataOS.writeBytes(CRLF);
int iBytesAvailable = fileInputStream.available();
byte[] byteData = new byte[iBytesAvailable];
int iBytesRead = fileInputStream.read(byteData, 0, iBytesAvailable);
while (iBytesRead > 0) {
dataOS.write(byteData, 0, iBytesAvailable); // 开始写内容
iBytesAvailable = fileInputStream.available();
iBytesRead = fileInputStream.read(byteData, 0, iBytesAvailable);
}
dataOS.writeBytes(CRLF);
fileInputStream.close();
}
// (结束)写--==================================--
dataOS.writeBytes(HYPHENS+BOUNDARY+HYPHENS);
dataOS.flush();
dataOS.close();
//取得响应
// 定义BufferedReader输入流来读取URL的响应
BufferedReader reader = new BufferedReader( new InputStreamReader(conn.getInputStream()));
String line = null ;
StringBuilder sb = new StringBuilder();
while ((line = reader.readLine()) != null ) {
sb.append(line);
}
if (conn != null) {
conn.disconnect();
}
conn =null;
result = sb.toString();
sb.setLength(1);
sb = null;
}catch (Exception ex)
{
ex.printStackTrace();
}
return result;
},string>,>