編輯:關於Android編程
項目中多處用到文件批量上傳功能,今天正好解決了此問題,在此寫出來,以便日後借鑒。
首先,以下架構下的批量文件上傳可能會失敗或者不會成功:
1.android客戶端+springMVC服務端:服務端采用org.springframework.web.multipart.MultipartHttpServletRequest作為批量上傳接收類,這種搭配下的批量文件上傳會失敗,最終服務端只會接受到一個文件,即只會接受到第一個文件。可能因為MultipartHttpServletRequest對servlet原本的HttpServletRequest類進行封裝,導致批量上傳有問題。
2.android客戶端+strutsMVC服務端:這種搭配下的多文件上傳,本人沒有親自嘗試,不做評論。如果有網友采用此種方式上傳失敗的,原因可能同1。
接下來說明上傳成功的方案:
采用android客戶端+Servlet(HttpServletRequest)進行文件上傳。
Servlet端代碼如下:
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try
{
List items = upload.parseRequest(request);
Iterator itr = items.iterator();
while (itr.hasNext())
{
FileItem item = (FileItem) itr.next();
if (item.isFormField())
{
System.out.println("表單參數名:" + item.getFieldName() + ",表單參數值:" + item.getString("UTF-8"));
}
else
{
if (item.getName() != null && !item.getName().equals(""))
{
System.out.println("上傳文件的大小:" + item.getSize());
System.out.println("上傳文件的類型:" + item.getContentType());
// item.getName()返回上傳文件在客戶端的完整路徑名稱
System.out.println("上傳文件的名稱:" + item.getName());
File tempFile = new File(item.getName());
// 上傳文件的保存路徑
File file = new File(sc.getRealPath("/") + savePath, tempFile.getName());
item.write(file);
request.setAttribute("upload.message", "上傳文件成功!");
} else
{
request.setAttribute("upload.message", "沒有選擇上傳文件!");
}
}
}
}
catch (FileUploadException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
request.setAttribute("upload.message", "上傳文件失敗!");
}
request.getRequestDispatcher("/uploadResult.jsp").forward(request, response);android端代碼如下:
public class SocketHttpRequester {
/**
*多文件上傳
* 直接通過HTTP協議提交數據到服務器,實現如下面表單提交功能:
*
* @param path 上傳路徑(注:避免使用localhost或127.0.0.1這樣的路徑測試,因為它會指向手機模擬器,你可以使用http://www.iteye.cn或http://192.168.1.101:8083這樣的路徑測試)
* @param params 請求參數 key為參數名,value為參數值
* @param file 上傳文件
*/
public static boolean post(String path, Map
public class FormFile {
/* 上傳文件的數據 */
private byte[] data;
private InputStream inStream;
private File file;
private int fileSize;
/* 文件名稱 */
private String filname;
/* 請求參數名稱*/
private String parameterName;
/* 內容類型 */
private String contentType = "application/octet-stream";
public FormFile(String filname, byte[] data, String parameterName, String contentType) {
this.data = data;
this.filname = filname;
this.parameterName = parameterName;
if(contentType!=null) this.contentType = contentType;
}
public FormFile(String filname, File file, String parameterName, String contentType) {
this.filname = filname;
this.parameterName = parameterName;
this.file = file;
try {
this.inStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
if(contentType!=null) this.contentType = contentType;
}
public FormFile(InputStream inStream, int fileSize, String filname,
String parameterName, String contentType) {
super();
this.inStream = inStream;
this.fileSize = fileSize;
this.filname = filname;
this.parameterName = parameterName;
this.contentType = contentType;
}
public int getFileSize() {
return fileSize;
}
public File getFile() {
return file;
}
public InputStream getInStream() {
return inStream;
}
public byte[] getData() {
return data;
}
public String getFilname() {
return filname;
}
public void setFilname(String filname) {
this.filname = filname;
}
public String getParameterName() {
return parameterName;
}
public void setParameterName(String parameterName) {
this.parameterName = parameterName;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
}注:以上android端上傳代碼是從網上借用的,對原作者表示感謝!
以上代碼經本人測試,能正常進行多文件上傳。
使用數據源碼解析Android中的Adapter、BaseAdapter、ArrayAdapter、SimpleAdapter和SimpleCursorAdapter
Adapter相當於一個數據源,可以給AdapterView提供數據,並根據數據創建對應的UI,可以通過調用AdapterView的setAdapter方法使得Adapt
AndroidStudio多AppId多渠道快速打包
一直感覺AndroidStudio沒有eclipse快,但是最近由於遇到一個問題不得不將工程遷移到AndroidStudio上,遷移後之前在eclipse上所做的所有批量
Android Multimedia框架總結(十)Stagefright框架之音視頻輸出過程
前言:上篇文中最後介紹了數據解碼放到Buffer過程,今天分析的是stagefright框架中音視頻輸出過程:先看下今天的Agenda:一張圖回顧數據處理過程 視頻渲染器
Android編程開發之Spinner控件用法實例分析
本文實例講述了Android編程開發之Spinner控件用法。分享給大家供大家參考,具體如下:下拉列表 Spinner,Spinner是一個每次只能選擇所有項的一個項的控