※ 引述《yauhh (喲)》之銘言:
: 嗨各位,最近處理檔案上傳遇到了問題不知道怎麼解決.
: 我採用的上傳方案是用HttpClient,不是HttpURLConnection.
: 用Apache HTTP方案中的HttpClient搭配MultiPartEntity,
: 可以做出彷彿一個網頁表單那樣,放一個檔案欄位,後面跟著一些註解文字,
: 這樣子上傳. 但是這樣子發現,手機中小的檔案很容易上傳,
: 但是大的檔案傳不上去. (而程式沒有Exception,而且200 OK.)
: 查了一些資料,知道好像有InputStreamEntity可以.setChunked(true)
: 變成分塊方式傳輸. 但是該怎麼整合MultiPartEntity和InputStreamEntity呢?
: 我原本的程式是
: HttpPost hpo = new HttpPost(url);
: MultiPartEntity mupent = new MultiPartEntity();
: mupent.addPart(...
: ...
: hpo.setEntity(mupent);
: HttpPost的entity是否只能塞一個? 能不能在MultiPartEntity中放一些InputStream-
: Entity,使得.isChunked為true? 或者,如何直接調整MultiPartEntity為chunked?
我給自己的問題找到答案:
MultipartEntity中可以放StringBody, FileBody,也可以放InputStreamBody.
放了FileBody時,我發現
entity.isChunked() 為false
entity.isRepeatable() 為true (可以反覆讀取檔案內容)
entity.isStreaming() 為false
而放了InputStreamBody,則是
entity.isChunked() 為true
entity.isRepeatable() 為false
entity.isStreaming() 為true
而 httpClient.execute(httpPost) 得到200 OK卻沒有看到上傳檔案,
其實是自己耍烏龍沒有發現server有檔案格式檢查.
但是講起檔案格式檢查,也有個怪怪的地方:
本來我用JPEG規格定義的magic number (檔案開頭二位元為0xFF 0xD8,
檔案最後二位元為0xFF 0xD9) 來判斷檔案其實是不是JPEG檔,
但是自己手機的照片 /sdcard/DCIM/Camera/*.jpg,上傳之後發現
檔案最後二位元不符合規定的magic number.
這就不知道手機的相機是怎麼處理JPEG了.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.205.0.23
※ 編輯: yauhh 來自: 61.231.70.252 (04/07 00:18)