java url 上传文件_Java使用HttpURLConnection上传文件(转)
從普通Web頁(yè)面上傳文件很簡(jiǎn)單,只需要在form標(biāo)簽叫上enctype="multipart/form-data"即可,剩余工作便都交給瀏覽器去完成數(shù)據(jù)收集并發(fā)送Http請(qǐng)求。但是如果沒(méi)有頁(yè)面的話要怎么上傳文件呢?
由于脫離了瀏覽器的環(huán)境,我們就要自己去完成數(shù)據(jù)的收集并發(fā)送請(qǐng)求,所以就很麻煩了。首先我們來(lái)寫(xiě)個(gè)JSP頁(yè)面并看看瀏覽器發(fā)出的Http請(qǐng)求是什么樣的
JSP頁(yè)面:
TestSubmit參數(shù)
文件1
文件2
假如我參數(shù)寫(xiě)的內(nèi)容是hello word,然后二個(gè)文件是二個(gè)簡(jiǎn)單的txt文件,form提交的信息為:
-----------------------------7da2e536604c8
Content-Disposition:?form-data;?name="username"
hello?word
-----------------------------7da2e536604c8
Content-Disposition:?form-data;?name="file1";?filename="D:/haha.txt"
Content-Type:?text/plain
haha
hahaha
-----------------------------7da2e536604c8
Content-Disposition:?form-data;?name="file2";?filename="D:/huhu.txt"
Content-Type:?text/plain
messi
huhu
-----------------------------7da2e536604c8--
研究下規(guī)律發(fā)現(xiàn)有如下幾點(diǎn)特征:
1. 第一行是“-----------------------------7da2e536604c8”作為分隔符,然后是“/r/n”回車(chē)換行符。 這個(gè)7da2e536604c8分隔符瀏覽器是隨機(jī)生成的。
2. 第二行是Content-Disposition: form-data; name="username"。代表form表單的數(shù)據(jù)域,name對(duì)應(yīng)頁(yè)面input標(biāo)簽的name值。
3. 第三行是“/r/n”回車(chē)換行符。
4. 第四行是參數(shù)username的值。
5. 第五行是7da2e536604c8分隔符。
6. 從第六行到第十行和從第十二行到第十六行,分別是上傳的兩個(gè)文件的數(shù)據(jù)域。
7. 第十二行是Content-Disposition: form-data; name="file2"; filename="D:/huhu.txt"。name對(duì)應(yīng)頁(yè)面input標(biāo)簽的name值,filename對(duì)應(yīng)要上傳的文件名(包括路徑在內(nèi))。
8. 第十三行如果是文件就有Content-Type: text/plain。這里上傳的是txt文件所以是text/plain,如果上穿的是jpg圖片的話就是image/jpg了,可以自己試試看看。然后就是回車(chē)換行符。
9. 第十五、十六行就是文件的內(nèi)容了。如:
messi
huhu
10. 最后一行是-----------------------------7da2e536604c8--。注意最后多了二個(gè)“--”,作為結(jié)束的標(biāo)志。
那么我們只要模擬這個(gè)數(shù)據(jù),并寫(xiě)入到Http請(qǐng)求中便能實(shí)現(xiàn)文件的上傳。
其實(shí),在我之前的文章:HttpClient使用詳解?,就已經(jīng)有利用HttpClient工具包上傳文件的例子,HttpClient是Apache的一個(gè)強(qiáng)大的模擬并發(fā)送所有Http請(qǐng)求的開(kāi)源類(lèi)庫(kù),有時(shí)間的,大家可以學(xué)習(xí)學(xué)習(xí),但本篇文章中,并不以HttpClient為例,而是采用Java自帶的HttpURLConnection實(shí)現(xiàn)的。
import?java.io.BufferedReader;
import?java.io.DataInputStream;
import?java.io.DataOutputStream;
import?java.io.File;
import?java.io.FileInputStream;
import?java.io.InputStreamReader;
import?java.io.OutputStream;
import?java.net.HttpURLConnection;
import?java.net.URL;
import?java.util.HashMap;
import?java.util.Iterator;
import?java.util.Map;
import?net.sf.jmimemagic.Magic;
import?net.sf.jmimemagic.MagicMatch;
public?class?HttpPostUploadUtil?{
/**
*?@param?args
*/
public?static?void?main(String[]?args)?{
String?filepath?=?"E:\\ziliao\\0.jpg";
String?urlStr?=?"http://127.0.0.1:8080/minicms/up/up_result.jsp";
Map?textMap?=?new?HashMap();
textMap.put("name",?"testname");
Map?fileMap?=?new?HashMap();
fileMap.put("userfile",?filepath);
String?ret?=?formUpload(urlStr,?textMap,?fileMap);
System.out.println(ret);
}
/**
*?上傳圖片
*?@param?urlStr
*?@param?textMap
*?@param?fileMap
*?@return
*/
public?static?String?formUpload(String?urlStr,?Map?textMap,?Map?fileMap)?{
String?res?=?"";
HttpURLConnection?conn?=?null;
String?BOUNDARY?=?"---------------------------123821742118716";?//boundary就是request頭和上傳文件內(nèi)容的分隔符
try?{
URL?url?=?new?URL(urlStr);
conn?=?(HttpURLConnection)?url.openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(30000);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection",?"Keep-Alive");
conn.setRequestProperty("User-Agent",?"Mozilla/5.0?(Windows;?U;?Windows?NT?6.1;?zh-CN;?rv:1.9.2.6)");
conn.setRequestProperty("Content-Type",?"multipart/form-data;?boundary="?+?BOUNDARY);
OutputStream?out?=?new?DataOutputStream(conn.getOutputStream());
//?text
if?(textMap?!=?null)?{
StringBuffer?strBuf?=?new?StringBuffer();
Iterator>?iter?=?textMap.entrySet().iterator();
while?(iter.hasNext())?{
Map.Entry?entry?=?iter.next();
String?inputName?=?(String)?entry.getKey();
String?inputValue?=?(String)?entry.getValue();
if?(inputValue?==?null)?{
continue;
}
strBuf.append("\r\n").append("--").append(BOUNDARY).append("\r\n");
strBuf.append("Content-Disposition:?form-data;?name=\""?+?inputName?+?"\"\r\n\r\n");
strBuf.append(inputValue);
}
out.write(strBuf.toString().getBytes());
}
//?file
if?(fileMap?!=?null)?{
Iterator>?iter?=?fileMap.entrySet().iterator();
while?(iter.hasNext())?{
Map.Entry?entry?=?iter.next();
String?inputName?=?(String)?entry.getKey();
String?inputValue?=?(String)?entry.getValue();
if?(inputValue?==?null)?{
continue;
}
File?file?=?new?File(inputValue);
String?filename?=?file.getName();
MagicMatch?match?=?Magic.getMagicMatch(file,?false,?true);
String?contentType?=?match.getMimeType();
StringBuffer?strBuf?=?new?StringBuffer();
strBuf.append("\r\n").append("--").append(BOUNDARY).append("\r\n");
strBuf.append("Content-Disposition:?form-data;?name=\""?+?inputName?+?"\";?filename=\""?+?filename?+?"\"\r\n");
strBuf.append("Content-Type:"?+?contentType?+?"\r\n\r\n");
out.write(strBuf.toString().getBytes());
DataInputStream?in?=?new?DataInputStream(new?FileInputStream(file));
int?bytes?=?0;
byte[]?bufferOut?=?new?byte[1024];
while?((bytes?=?in.read(bufferOut))?!=?-1)?{
out.write(bufferOut,?0,?bytes);
}
in.close();
}
}
byte[]?endData?=?("\r\n--"?+?BOUNDARY?+?"--\r\n").getBytes();
out.write(endData);
out.flush();
out.close();
//?讀取返回?cái)?shù)據(jù)
StringBuffer?strBuf?=?new?StringBuffer();
BufferedReader?reader?=?new?BufferedReader(new?InputStreamReader(conn.getInputStream()));
String?line?=?null;
while?((line?=?reader.readLine())?!=?null)?{
strBuf.append(line).append("\n");
}
res?=?strBuf.toString();
reader.close();
reader?=?null;
}?catch?(Exception?e)?{
System.out.println("發(fā)送POST請(qǐng)求出錯(cuò)。"?+?urlStr);
e.printStackTrace();
}?finally?{
if?(conn?!=?null)?{
conn.disconnect();
conn?=?null;
}
}
return?res;
}
}
在上述代碼中,關(guān)于contentType的獲取方式,我在上篇文章中已經(jīng)講述過(guò)了,有興趣的可以看看。
總結(jié)
以上是生活随笔為你收集整理的java url 上传文件_Java使用HttpURLConnection上传文件(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java 深克隆_Java实现深克隆的两
- 下一篇: java 注解_怎样理解 Java