xUtils上傳檔案使用表單的方式上傳檔案。
阿新 • • 發佈:2019-02-15
專案中需要進行上傳多張圖片,比如說,發表文章的時候最多可以上傳9張圖片。
List<File> filelist = new ArrayList<File>(); for (int i = 0; i < filePath.length; i++) { <span style="white-space:pre"> </span>filelist.add(new File(filePath[i])); } RequestParams params = new RequestParams(); String ts = DateUtils.getTimeStamp(10); params.addBodyParameter("apipwd",EncryptUtils.md5(ConstDef.API_PWD + ts)); params.addBodyParameter("apitime", ts); params.addBodyParameter("imgfile[]", filelist, "image/jpeg");
解決這個問題遇到的現象:
a、這裡發現了,addBodyParameter()會是HashMap,如果寫成params.addBodyParameter("imgfile", filelist, "image/jpeg");只會留下最後一個。
然後就,修改看看HashMap如何實現一個Key對應多個value,感覺這種方法不好。就使用
private HashMap<String, ArrayList<ContentBody>> mutiFileParams;解決這個問題。
b、params.addBodyParameter("imgfile", filelist, "image/jpeg");這裡每次發現只有最後一張圖片被伺服器接收到了;
c、第二懷疑是否是
multipart/form-dataenctype="multipart/form-data"沒有加,除錯的時候發現是加了的。 d、最後Fidder抓包,發現這種寫法是params.addBodyParameter("imgfile", filelist, "image/jpeg");是上傳了9張照片。 (1)這裡imgfile[]要特別注意寫法。 (2)除錯進入MultipartEntity.java驗證那個使用表單發表需要的資訊; (3)第三方庫的原始碼進行除錯非常有利於解決問題; (4)主要是修改
在檔案RequestParams.java中修改。public void addBodyParameter(String key, List<File> fileList) { if (mutiFileParams == null) { mutiFileParams = new HashMap<String, ArrayList<ContentBody>>(); } ArrayList<ContentBody> fileBodies = null; if (fileList != null) { fileBodies = new ArrayList<ContentBody>(); for (File file : fileList) { fileBodies.add(new FileBody(file)); } } mutiFileParams.put(key, fileBodies); } public void addBodyParameter(String key, List<File> fileList, String mimeType) { if (mutiFileParams == null) { mutiFileParams = new HashMap<String, ArrayList<ContentBody>>(); } ArrayList<ContentBody> fileBodies = null; if (fileList != null) { fileBodies = new ArrayList<ContentBody>(); for (File file : fileList) { fileBodies.add(new FileBody(file, mimeType)); } } mutiFileParams.put(key, fileBodies); }
else if (mutiFileParams != null && !mutiFileParams.isEmpty()) {
MultipartEntity multipartEntity = new MultipartEntity(
HttpMultipartMode.STRICT, null, Charset.forName(charset));
if (bodyParams != null && !bodyParams.isEmpty()) {
for (NameValuePair param : bodyParams) {
try {
multipartEntity.addPart(param.getName(),
new StringBody(param.getValue()));
} catch (UnsupportedEncodingException e) {
LogUtils.e(e.getMessage(), e);
}
}
}
for (ConcurrentHashMap.Entry<String, ArrayList<ContentBody>> entry : mutiFileParams
.entrySet()) {
ArrayList<ContentBody> filelist = entry.getValue();
if (filelist != null) {
for (ContentBody contentBody : filelist) {
multipartEntity.addPart(entry.getKey(), contentBody);
}
}
}
result = multipartEntity;
}
花了大半個上午的時間和中午的時間解決這個問題,雖然耗費了蠻多時間,過程還是值得自己再次借鑑。