上一篇寫了如何拍照截圖的功能秽澳,接下來就是如何上傳照片的問題需忿。
如果你們公司的需求是把圖片上傳至七牛嫡秕,只需要使用七牛的sdk就可以上傳到七牛物喷,基本也不需要自己來操作钧汹。
但是如果你也遇到了一個需求:就是需要把圖片上傳到自己的服務(wù)器(后臺同學(xué)只寫了:multipart上傳)猴娩,如果不了解http協(xié)議的話钟些,可能就有點暈了墩朦,這是什么鬼坯认。
關(guān)于什么是mutipart方式上傳,先上兩張圖,來直觀的看一下牛哺。(參考:https://imququ.com/post/four-ways-to-post-data-in-http.html)
Request Header參考:http://kb.cnblogs.com/page/92320/
通過上面的圖片陋气,可以很直觀的看到上傳一個文件時候的POST參數(shù)以及Request Headers的內(nèi)容。
其中就有:Content-Type multipart/form-data; boundary=-----------------------------23659361659
我們使用表單上傳文件時引润,必須讓 <form> 表單的 enctyped 等于 multipart/form-data巩趁。所以在上傳大文件或圖片時,我們就需要設(shè)置Content-Type的方式上傳淳附。
上面的圖片可以看出:
上傳文件:test.txt
文件內(nèi)容為:123test议慰。
這里我們需要關(guān)注的是:Content-Disposition:form-data; name="file"; filename = "test.txt"
還可以發(fā)現(xiàn)頭尾都是"----------------------2396593631659",并且與第一張圖的boundary一樣。
boundary的作用是用來分割多個文件/表單項的奴曙。
上面是上傳文件的别凹,下面發(fā)兩張上傳圖片的post信息:
通過對比可以發(fā)現(xiàn),區(qū)別點在Content-type,上傳txt文件時為:text/plain, 而上傳圖片時為:image/jpeg
Content-Type表明信息類型缆毁,缺省值為" text/plain"番川。它包含了主要類型(primary type)和次要類型(subtype)兩個部分,兩者之間用"/"分割脊框。主要類型有9種颁督,分別是application、audio浇雹、example沉御、image、message昭灵、model吠裆、multipart、text烂完、video试疙。
每一種主要類型下面又有許多次要類型:
text/plain:純文本,文件擴展名.txt
text/html:HTML文本抠蚣,文件擴展名.htm和.html
image/jpeg:jpeg格式的圖片祝旷,文件擴展名.jpg
image/gif:GIF格式的圖片,文件擴展名.gif
audio/x-wave:WAVE格式的音頻嘶窄,文件擴展名.wav
audio/mpeg:MP3格式的音頻怀跛,文件擴展名.mp3
video/mpeg:MPEG格式的視頻,文件擴展名.mpg
application/zip:PK-ZIP格式的壓縮文件柄冲,文件擴展名.zip
通過上面的介紹吻谋,我們可以總結(jié)出,如果要模擬表單實現(xiàn)multipart上傳现横,則需要做到以下幾點:
1.請求方式post
2.請求頭的Content-type為multipart/form-data;boundary=---1293834(任意幾個數(shù)字);
3. a.請求體中需要先以"-----1293834\r\n(\r\n的作用是換行)"來分隔漓拾,
? b.然后寫入Content-Disposition:form-data;name="iamge(此處需要與服務(wù)器約定)";filename="test.jpg";
? c.Content-Type: image/jpeg(這里根據(jù)自己情況來決定)
? d.圖片或文件的byte[]數(shù)組阁最。
? e.最后以"-----1293834--\r\n"結(jié)尾。
4.最后讀取服務(wù)器的返回信息骇两,來判斷是否成功闽撤。
? 細(xì)節(jié)決定成敗:2中的"---1293834"與3中的"-----1293834"差2個"--"脯颜。
下面上一個自己的工具方法吧,可以直接拿來用:
? ? public static String uploadFile(String uploadUrl, byte[] bbyte) {
? ? ? ? String end = "\r\n";
? ? ? ? String twoHyphens = "--";
? ? ? ? String boundary = "---------------------------823928434";
? ? ? ? try {
? ? ? ? ? ? URL url = new URL(uploadUrl);
? ? ? ? ? ? HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
? ? ? ? ? ? httpURLConnection.setDoInput(true);
? ? ? ? ? ? httpURLConnection.setDoOutput(true);
? ? ? ? ? ? httpURLConnection.setUseCaches(false);
? ? ? ? ? ? httpURLConnection.setRequestMethod("POST");
? ? ? ? ? ? httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
? ? ? ? ? ? httpURLConnection.setRequestProperty("Charset", "UTF-8");
? ? ? ? ? ? httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
? ? ? ? ? ? DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
? ? ? ? ? ? dos.writeBytes(twoHyphens + boundary + end);
? ? ? ? ? ? dos.writeBytes("Content-Disposition: form-data; name=\"file1\"; filename=\"test.jpg\"" + end);
? ? ? ? ? ? dos.writeBytes(end);
? ? ? ? ? ? dos.write(bbyte);
? ? ? ? ? ? dos.writeBytes(end);
? ? ? ? ? ? dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
? ? ? ? ? ? dos.flush();
? ? ? ? ? ? // 讀取服務(wù)器返回結(jié)果
? ? ? ? ? ? InputStream is = httpURLConnection.getInputStream();
? ? ? ? ? ? InputStreamReader isr = new InputStreamReader(is, "utf-8");
? ? ? ? ? ? BufferedReader br = new BufferedReader(isr);
? ? ? ? ? ? String result = br.readLine();
? ? ? ? ? ? Log.i("response", "" + result);
? ? ? ? ? ? is.close();
? ? ? ? ? ? return? result;
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? return "";
? ? }
最后附上一篇比較不錯的文章:
http://www.reibang.com/p/a6d086a3997d
————————————————
版權(quán)聲明:本文為CSDN博主「飛鳥_」的原創(chuàng)文章贩据,遵循CC 4.0 BY-SA版權(quán)協(xié)議留特,轉(zhuǎn)載請附上原文出處鏈接及本聲明撵术。
原文鏈接:https://blog.csdn.net/likuan0214/article/details/51768839