1. 程式人生 > >xUtils上傳檔案使用表單的方式上傳檔案。

xUtils上傳檔案使用表單的方式上傳檔案。

專案中需要進行上傳多張圖片,比如說,發表文章的時候最多可以上傳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-data
enctype="multipart/form-data"沒有加,除錯的時候發現是加了的。 d、最後Fidder抓包,發現這種寫法是params.addBodyParameter("imgfile", filelist, "image/jpeg");是上傳了9張照片。 (1)這裡imgfile[]要特別注意寫法。 (2)除錯進入MultipartEntity.java驗證那個使用表單發表需要的資訊; (3)第三方庫的原始碼進行除錯非常有利於解決問題; (4)主要是修改
	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);
	}
在檔案RequestParams.java中修改。
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;
		} 


花了大半個上午的時間和中午的時間解決這個問題,雖然耗費了蠻多時間,過程還是值得自己再次借鑑。