Android模擬 HTTP multipart/form-data 請求協議資訊實現圖片上傳
阿新 • • 發佈:2019-01-02
轉自:http://www.linuxidc.com/Linux/2011-08/41944.htm
問題:
Android應用中,當遇到填寫使用者資訊、發表評論等操作,不可避免會遇到“form表單操作”(類似web form操作)上傳圖片的功能。
在這種情況下,使用Android的HTTPConnection/ ApacheHTTP 通過POST 和GET的方式就實現不了。
解決方法:
Android客戶端通過模擬 HTTP multipart/form-data 請求協議資訊實現圖片上傳。
- /**
- *檔名稱:UploadImage.java
- *
-
*版權資訊:ApacheLicense,Version2.0
- *
- *功能描述:實現圖片檔案上傳。
- *
- *建立日期:2011-5-10
- *
- *作者:BertLee
- */
- /*
- *修改歷史:
- */
- publicclassUploadImage{
- Stringmultipart_form_data="multipart/form-data";
- StringtwoHyphens="--";
- Stringboundary="****************fD4fH3gL0hK7aI6";//資料分隔符
- StringlineEnd=System.getProperty("line.separator");//Thevalueis"\r\n"inWindows.
- /*
- *上傳圖片內容,格式請參考HTTP協議格式。
- *人人網Photos.upload中的”程式呼叫“http://wiki.dev.renren.com/wiki/Photos.upload#.E7.A8.8B.E5.BA.8F.E8.B0.83.E7.94.A8
- *對其格式解釋的非常清晰。
- *格式如下所示:
- *--****************fD4fH3hK7aI6
- *Content-Disposition:form-data;name="upload_file";filename="apple.jpg"
- *Content-Type:image/jpeg
- *
-
*這兒是檔案的內容,二進位制流的形式
- */
- privatevoidaddImageContent(Image[]files,DataOutputStreamoutput){
- for(Imagefile:files){
- StringBuildersplit=newStringBuilder();
- split.append(twoHyphens+boundary+lineEnd);
- split.append("Content-Disposition:form-data;name=\""+file.getFormName()+"\";filename=\""+file.getFileName()+"\""+lineEnd);
- split.append("Content-Type:"+file.getContentType()+lineEnd);
- split.append(lineEnd);
- try{
- //傳送圖片資料
- output.writeBytes(split.toString());
- output.write(file.getData(),0,file.getData().length);
- output.writeBytes(lineEnd);
- }catch(IOExceptione){
- thrownewRuntimeException(e);
- }
- }
- }
- /*
- *構建表單欄位內容,格式請參考HTTP協議格式(用FireBug可以抓取到相關資料)。(以便上傳表單相對應的引數值)
- *格式如下所示:
- *--****************fD4fH3hK7aI6
- *Content-Disposition:form-data;name="action"
- *//一空行,必須有
- *upload
- */
- privatevoidaddFormField(Set<Map.Entry<Object,Object>>params,DataOutputStreamoutput){
- StringBuildersb=newStringBuilder();
- for(Map.Entry<Object,Object>param:params){
- sb.append(twoHyphens+boundary+lineEnd);
- sb.append("Content-Disposition:form-data;name=\""+param.getKey()+"\""+lineEnd);
- sb.append(lineEnd);
- sb.append(param.getValue()+lineEnd);
- }
- try{
- output.writeBytes(sb.toString());//傳送表單欄位資料
- }catch(IOExceptione){
- thrownewRuntimeException(e);
- }
- }
- /**
- *直接通過HTTP協議提交資料到伺服器,實現表單提交功能。
- *@paramactionUrl上傳路徑
- *@paramparams請求引數key為引數名,value為引數值
- *@paramfiles上傳檔案資訊
- *@return返回請求結果
- */
- publicStringpost(StringactionUrl,Set<Map.Entry<Object,Object>>params,Image[]files){
- HttpURLConnectionconn=null;
- DataOutputStreamoutput=null;
- BufferedReaderinput=null;
- try{
- URLurl=newURL(actionUrl);
- conn=(HttpURLConnection)url.openConnection();
- conn.setConnectTimeout(120000);
- conn.setDoInput(true);//允許輸入
- conn.setDoOutput(true);//允許輸出
- conn.setUseCaches(false);//不使用Cache
- conn.setRequestMethod("POST");
- conn.setRequestProperty("Connection","keep-alive");
- conn.setRequestProperty("Content-Type",multipart_form_data+";boundary="+boundary);
- conn.connect();
- output=newDataOutputStream(conn.getOutputStream());
- addImageContent(files,output);//新增圖片內容
- addFormField(params,output);//新增表單欄位內容
- output.writeBytes(twoHyphens+boundary+twoHyphens+lineEnd);//資料結束標誌
- output.flush();
- intcode=conn.getResponseCode();
- if(code!=200){
- thrownewRuntimeException("請求‘"+actionUrl+"’失敗!");
- }
- input=newBufferedReader(newInputStreamReader(conn.getInputStream()));
- StringBuilderresponse=newStringBuilder();
- StringoneLine;
- while((oneLine=input.readLine())!=null){
- response.append(oneLine+lineEnd);
- }
- returnresponse.toString();
- }catch(IOExceptione){
- thrownewRuntimeException(e);
- }finally{
- //統一釋放資源
- try{
- if(output!=null){
- output.close();
- }
- if(input!=null){
- input.close();
- }
- }catch(IOExceptione){
- thrownewRuntimeException(e);
- }
- if(conn!=null){
- conn.disconnect();
- }
- }
- }
- publicstaticvoidmain(String[]args){
- try{
- Stringresponse="";
- BufferedReaderin=newBufferedReader(newFileReader("config/actionUrl.properties"));
- StringactionUrl=in.readLine();
- //讀取表單對應的欄位名稱及其值
- PropertiesformDataParams=newProperties();
- formDataParams.load(newFileInputStream(newFile("config/formDataParams.properties")));
- Set<Map.Entry<Object,Object>>params=formDataParams.entrySet();
- //讀取圖片所對應的表單欄位名稱及圖片路徑
- PropertiesimageParams=newProperties();
- imageParams.load(newFileInputStream(newFile("config/imageParams.properties")));
- Set<Map.Entry<Object,Object>>images=imageParams.entrySet();
- Image[]files=newImage[images.size()];
- inti=0;
- for(Map.Entry<Object,Object>image:images){
- Imagefile=newImage(image.getValue().toString(),image.getKey().toString());
- files[i++]=file;
- }
- //Imagefile=newImage("images/apple.jpg","upload_file");
- //Image[]files=newImage[0];
- //files[0]=file;
- response=newUploadImage().post(actionUrl,params,files);
- System.out.println("返回結果:"+response);
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }