安卓开发多文件上传Spring MVC作为服务器端

时间:2021-12-17 04:00:46

服务器端核心代码:

package com.missionsky.mvc.controller;

import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@Controller
@RequestMapping("/upload.do")
public class UploadController {
@RequestMapping(params = "intent=upload")
public void uploadFile(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
int num = 0;
System.out.println("FileUploadOrLoad");
// 设置request编码,主要是为了处理普通输入框中的中文问题
request.setCharacterEncoding("UTF-8");
// 这里对request进行封装,RequestContext提供了对request多个访问方法
org.apache.commons.fileupload.RequestContext requestContext = new ServletRequestContext(request);
// 判断表单是否是Multipart类型的。这里可以直接对request进行判断,不过已经以前的用法了
if (FileUpload.isMultipartContent(requestContext)) {

num++;
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置文件的缓存路径
factory.setRepository(new File("d:/tmp/"));
File dir = new File("d:\\download");
System.out.println("dir");

if (!dir.exists()) {
dir.mkdirs();
}
// System.out.print("已经生成临时文件");

ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传文件大小的上限,-1表示无上限
upload.setSizeMax(100000 * 1024 * 1024);
List items = new ArrayList();
try {
// 上传文件,并解析出所有的表单字段,包括普通字段和文件字段
items = upload.parseRequest(request);
} catch (FileUploadException e1) {
System.out.println("文件上传发生错误" + e1.getMessage());
}
// 下面对每个字段进行处理,分普通字段和文件字段
Iterator it = items.iterator();


while (it.hasNext()) {
DiskFileItem fileItem = (DiskFileItem) it.next();
// 如果是普通字段
if (fileItem.isFormField()) {
System.out.println(fileItem.getFieldName()
+ " "
+ fileItem.getName()
+ " "
+ new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));
} else {
System.out.println(fileItem.getFieldName() + " "
+ fileItem.getName() + " "
+ fileItem.isInMemory() + " "
+ fileItem.getContentType() + " "
+ fileItem.getSize());
// 保存文件,其实就是把缓存里的数据写到目标路径下
if (fileItem.getName() != null && fileItem.getSize() != 0) {
File fullFile = new File(fileItem.getName());
File newFile = new File("d:/download/"
+ fullFile.getName() + num);
try {
fileItem.write(newFile);
// 文件上传成功 跟新数据库任务表 添加对应任务
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("文件没有选择 或 文件内容为空");
}
}
}

//上传完毕后手动删除缓存的 文件
File file = new File("D:/tmp");
if (file.exists()) {
File[] listFiles = file.listFiles();
for (File deleteFile : listFiles) {
deleteFile.delete();
}
}

// 设置响应码
response.setStatus(200);
}
}
}

客户端核心代码:


new UploadTask("http://192.168.206.125:8080/spring/upload.do?intent=upload", files).execute();



private class UploadTask extends AsyncTask<Void, Void, String> {

private String url;
private List<File> files;

public UploadTask(String url, List<File> files) {
// TODO Auto-generated constructor stub
this.url = url;
this.files = files;
}

@Override
protected String doInBackground(Void... params) {
// TODO Auto-generated method stub
return uploadFile(url, files);
}

@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);

Toast.makeText(mActivity, result, Toast.LENGTH_SHORT).show();
}
}


private String uploadFile(String url, List<File> files) {
HttpClient client=new DefaultHttpClient();// 开启一个客户端 HTTP 请求
HttpPost post = new HttpPost(url);//创建 HTTP POST 请求
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
// builder.setCharset(Charset.forName("uft-8"));//设置请求的编码格式
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//设置浏览器兼容模式
int count=0;
for (File file:files) {
// FileBody fileBody = new FileBody(file);//把文件转换成流对象FileBody
// builder.addPart("file"+count, fileBody);
builder.addBinaryBody("file"+count, file);
count++;
}

builder.addTextBody("method", "upload");//设置请求参数
builder.addTextBody("fileTypes", ".pcap");//设置请求参数
HttpEntity entity = builder.build();// 生成 HTTP POST 实体
post.setEntity(entity);//设置请求参数
HttpResponse response = null;
try {
response = client.execute(post);
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 发起请求 并返回请求的响应
if (response != null && response.getStatusLine().getStatusCode()==200) {
return "上传成功";
}
return "上传失败";
}

服务器要用到的jar包:

<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>

客户端要用到的jar包:
httpcore-4.3.2.jar
httpmime-4.3.5.jar