1.這篇文章是基於volley框架,新加的檔案上傳的**的分析
2.主要是了解這個請求類:multipartrequest
3.我下的這個volley庫,上傳時候有點小問題.
private uploadmultipartentity mmultipartentity;
/*** default connection timeout for multipart requests */
public static final int timeout_ms = 60000;
public multipartrequest(int method, string url, listenerlistener, errorlistener errorlistener, loadinglistener loadinglistener)
// logutils.d("bacy", "upload->" + count + ",num->" + num);
long thistime = systemclock.uptimemillis();
if (thistime - time >= getrate() || count == num) }
}); }
setretrypolicy(new defaultretrypolicy(timeout_ms, defaultretrypolicy.default_max_retries, defaultretrypolicy.default_backoff_mult)); }
@override
public string getbodycontenttype()
@override
abstract protected responseparsenetworkresponse(networkresponse response);
@override
protected void deliverresponse(t response)
/*** get the protocol charset */
public string getprotocolcharset()
public void addpart(string key, string value)
public void addpart(string key, file file)
public uploadmultipartentity getmultipartentity()
在這個類中,定義了uploadmultipartentity這個類是繼承於multipartentity,只要把要上傳的檔案通過方法addpart加入就ok.為什麼呢?
1.首先了解volley庫的整個運作流程:
在網路請求時候,會呼叫basicnetwork的performrequest方法,原始碼如下(只擷取了一部分):
2.然後看這一行httpresponse = mhttpstack.performrequest(request, headers);
responseheaders = convertheaders(httpresponse.getallheaders());呼叫了mhttpstack用於網路請求的類
在這個方法裡面呼叫了 setconnectionparametersforrequest(connection, request);
3.然後在這個方法裡面,假如是用post請求,那麼,執行到:
case method.post:
connection.setrequestmethod("post");
addbodyifexists(connection, request);
break;
4.再看下addbodylfexists
}在這裡獲取了multipartrequest的uploadmultipartentity成員變數,然後呼叫了writeto方法.
然後回過頭來看這個類uploadmultipartentity他的方法為:
@override
public void writeto(outputstream outstream) throws ioexception else }
這裡判斷一下是否傳入了listener,這個什麼用呢,其實是用來計算進度的,也就是檔案上傳的百分比
然後先看 super.writeto(outstream);
public void writeto(final outputstream out) throws ioexception
for (part part : parts)
out.write(boundary.getclosingboundary());
out.flush(); }
在這裡就把那些新增的part依次呼叫part的writeto直接寫入輸出流,然後看下我們寫入的檔案部分,也就是filepart類
他的writeto方法如下:
public void writeto(outputstream out, boundary boundary) throws ioexception
} finally
out.write(crlf); }
看到這裡,可能明白了,他就是最好按照檔案的上傳格式,先上傳boundary邊界,然後再上傳檔案自己的流
在獲取這個邊界的時候最後會執行到如下**:
private byte generateheader(boundary boundary)
final bytearraybuffer buf = new bytearraybuffer(256);
return buf.tobytearray(); }
先就寫到這,那個用於進度的listener,相信聰明的大家一看就會。水平有限,但是努力追求技術的心是不會變的,不但要知其然,而且要知其所以然。順便把volley上傳下。。
Android上傳檔案,續
為了確實是什麼問題,我是這麼做的 我寫了乙個html的form表單,提交到遠端伺服器上,沒問題。然後用fiddler抓包軟體,抓取html的表單請求包和android傳送的請求包,對比。看看有什麼不一樣。最後發現,在請求包裡有 transfer encoding chunked 的時候,伺服器就獲取...
Android上傳檔案到WebService介面
這方面 好難找,直接貼 了,比較亂,做個筆記而已。主要utilpublic class uploadutil log.i connectwebservice start fis.close return new string base64.encode baos.tobytearray base64...
android 使用post方式上傳檔案
public static string post string actionurl,mapparams,mapfiles throws ioexception dataoutputstream outstream new dataoutputstream conn getoutputstream ...