spring mvc文件上传和基于servlet3的文件上传

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jialijuan521_zhang/article/details/79779874

今天下午整理了以下有关文件上传的知识,可能会有点乱,尝试了多种上传的方式,代码会有点乱,但是小编已经测试通过,只需复制下来,format一下即可看起来工整了,代码如下,如用于开发请自行完善。

package com.tyust.controller;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;


import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;


/**
 * @author zhangxiaowei
 * @date 创建时间:2018年4月1日 上午11:03:56
 * @version 1.0 该controller用于处理文件上传
 */
@Controller
@RequestMapping("/fileupload")
public class FileUploadController {
/**
* 依赖的日志对象
*/
private Logger logger = Logger.getLogger(this.getClass());
/**
* 文件上传页面

* @return
*/
@RequestMapping("fileuploadindex")
public String fileindex() {
String fileindex = "fileuploadindex";
return fileindex;

}


/**
* 基于CommonsMultipartResolver类的单文件上传,采用读取文件输入流到字节数组,最后将字节数组写入到文件输出流
* @param request
* @return
*/
@RequestMapping(value = "/executefileupload", method = RequestMethod.POST)
public String executeFileUpload(HttpServletRequest request) {
String result = "";
// 判断是否为多路文件上传请求
// boolean ismultipartrequest = cmr.isMultipart(request);
CommonsMultipartResolver cmr = new CommonsMultipartResolver(request.getServletContext());
boolean ismultipartrequest = cmr.isMultipart(request);
if (ismultipartrequest) { // 如果是多路文件上传请求
logger.debug("是多路请求");
InputStream ins = null; // 文件输入流
OutputStream os = null; // 文件输出流

String originalFileName = "";

// 解析文件上传请求
MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request;
// 下面这种方式无法得到上传的文件
// MultipartHttpServletRequest mr = cmr.resolveMultipart(request);
// 获取单个文件
MultipartFile mf = mr.getFile("file1");
if (mf == null) {
logger.debug("mf 为空");
} else { // 输出文件名称
logger.debug("mf 文件的名称为:" + mf.getOriginalFilename());
}
Iterator<String> filenames = mr.getFileNames();
while (filenames.hasNext()) {
logger.debug("filenames :" + filenames.next());
}
try {
ins = mf.getInputStream();
byte[] mfbt = new byte[(int) mf.getSize()];
// 将输入流的字节信息读入到字节数组中
ins.read(mfbt);
originalFileName = mf.getOriginalFilename();
logger.debug("源文件的名称为:" + originalFileName);
os = new FileOutputStream("D:\\" + originalFileName);
// 再将字节信息写入到服务器端文件上
os.write(mfbt);
os.flush(); // 刷新输出流
os.close();
ins.close();
// 关闭输入和输出流
} catch (IOException e) {
e.printStackTrace();
}
}
result = "success";
return result;
}



/**
* 基于CommonsMultipartResolver解析器的形式,上传多文件,采用transferTo方法的形式将MultipartFile直接写入到指定路径
* @param username
* @param age
* @param request
* @return
* @throws IOException
*/
@RequestMapping("/executeManyFileUpload")
public String executeMangFileUpload(@RequestParam("username") String username, @RequestParam("userage") int age,
HttpServletRequest request) throws IOException {
logger.debug("请求参数username:" + username);
logger.debug("请求参数usernage:" + age);
logger.debug("开始执行文件上传");
long start = System.currentTimeMillis();
CommonsMultipartResolver cmr = new CommonsMultipartResolver(request.getServletContext());
// 判断是否问多文件上传
if (cmr.isMultipart(request)) { // 如果是多文件上传
MultipartHttpServletRequest mhsr = (MultipartHttpServletRequest) request;
Iterator<String> filenames = mhsr.getFileNames();
while (filenames.hasNext()) {
logger.debug("filenams:" + filenames.next());
}
// 获取多文件上传的map对象
Map<String, MultipartFile> multipartmap = mhsr.getFileMap();
// 将map对象转换为实体对象
Set<Map.Entry<String, MultipartFile>> men = multipartmap.entrySet();
// 遍历实体对象
Iterator<Map.Entry<String, MultipartFile>> item = men.iterator();
MultipartFile mf = null;
InputStream ins = null;
OutputStream os = null;
byte[] filebyte;
File destfile = null;
while (item.hasNext()) {
// 获取单个文件实体
Map.Entry<String, MultipartFile> multipartitem = item.next();
String key = multipartitem.getKey();
mf = multipartmap.get(key);
if (!mf.isEmpty()) {
String orginalfilename = mf.getOriginalFilename();
destfile = new File("D:" + File.separator + orginalfilename
.substring(orginalfilename.lastIndexOf("\\") + 1, orginalfilename.length()));
mf.transferTo(destfile);
// ins = mf.getInputStream();
// filebyte = new byte[(int)mf.getSize()];
//
// os = new FileOutputStream("D:"+ File.separator +
// orginalfilename.substring(orginalfilename.lastIndexOf("\\")
// + 1,orginalfilename.length()));
// //将字节信息保存到本地
// ins.read(filebyte);
// os.write(filebyte);
// os.flush();
// ins.close();
// os.close();
}
}
}
long end = System.currentTimeMillis();
long usetime = start - end;
logger.debug("上传花费时间为:" + usetime);
return "success";
}


/**
* 基于spring mvc注解方式的多文件上传,采用MutipartFile接口对象
* @param mf
* @param mf2
* @param username
* @param userage
* @return
* @throws IllegalStateException
* @throws IOException
*/
@RequestMapping("onemultipartfile")
public String oneMultipartFile(@RequestParam("file1") MultipartFile mf, @RequestParam("file2") MultipartFile mf2,
@RequestParam("username") String username, @RequestParam("userage") String userage)
throws IllegalStateException, IOException {
logger.debug("username :" + username);
logger.debug("userage :" + userage);
String result = "success";
if (!mf.isEmpty() && !mf2.isEmpty()) { // 如果上传的文件不为空
// 获取文件名
String originalFileName = mf.getOriginalFilename();
String originalFileName2 = mf2.getOriginalFilename();
logger.debug("originalFileName is :" + originalFileName);
logger.debug("originalFileName2 is :" + originalFileName2);
// 指定保存到本地的文件路径
File dest = new File("D:" + File.separator
+ originalFileName.substring(originalFileName.lastIndexOf("\\") + 1, originalFileName.length()));
// 将文件上传到服务器
mf.transferTo(dest);
logger.debug("第一个文件上传完毕,开始第二个文件上传");
dest = new File("D:" + File.separator
+ originalFileName2.substring(originalFileName2.lastIndexOf("\\") + 1, originalFileName2.length()));
mf2.transferTo(dest);
logger.debug("文件上传成功");
} else { // 如果没有文件上传,则转发到错误页面
result = "error";
logger.debug("文件上传失败");
}
return result;

}




/**
* 使用CommonsMultipartFile实现多文件上传,该类实现了MutipartFile接口
* @param mf
* @param username
* @param userage
* @return
* @throws IllegalStateException
* @throws IOException
*/
@RequestMapping("manymultipartfile")
// public String manyMultipartFile(@RequestParam("file") MultipartFile
// mf[],@RequestParam("username") String username ,@RequestParam("userage")
// int userage) throws IllegalStateException, IOException {
// 采用CommonMultipartFile的形式
public String manyMultipartFile(@RequestParam("file") CommonsMultipartFile mf[],
@RequestParam("username") String username, @RequestParam("userage") int userage)
throws IllegalStateException, IOException {


logger.debug("username :" + username);
logger.debug("userage :" + userage);


String result = "success";
logger.debug("mf.length:" + mf.length);
File file = null;
String originalFileName;
// 遍历多路文件数组对象


for (int i = 0; i < mf.length; i++) {
if (!mf[i].isEmpty()) { // 如果MultipartFile不为空,则执行上传
originalFileName = mf[i].getOriginalFilename();
file = new File("D:" + File.separator + originalFileName
.substring(originalFileName.lastIndexOf("\\") + 1, originalFileName.length()));
logger.debug("正在上传第" + (i + 1) + "个文件");
mf[i].transferTo(file);
}
}
if (mf.length == 0) {
result = "error";
}
return result;
}

注意:在写基于servlet3的文件上传的时候,需要在web.xml中开启文件上传功能,在dispatcher下开启即可<multipart-config ></multipart-config>
/**
* 基于servlet3的单文件上传
* @param request
* @return
* @throws IOException
* @throws ServletException
*/
@RequestMapping("servletupload")
public String servletOneFileUpload(HttpServletRequest request) throws IOException, ServletException {
String result = "success";
// 通过request获取文件上传的Part,采用Servlet3的文件上传之后,上传的文件对象被封装成一个Part对象
Part part = request.getPart("file1");
// 获取文件名称
String originalFileName = part.getSubmittedFileName();
logger.debug("servlet3 ---> originalFileName:" + originalFileName);
String destfile = "D:" + File.separator + originalFileName;
part.write(destfile);
logger.debug("文件上传成功,成功保存到本地");
return result;
}

/**
* 基于servlet3的多文件上传
* @param request
* @return
* @throws IOException
* @throws ServletException
*/
@RequestMapping("servletManyFile")
public String servletManyFile(HttpServletRequest request) throws IOException, ServletException {
String result = "success";
// 获取所有上传的文件
Collection<Part> partslist = request.getParts();
if (partslist.size() == 0) {  //如果没有上传文件
result = "error";
} else {
logger.debug("partslist:" + partslist);
// 遍历上传的文件
Iterator<Part> itempart = partslist.iterator();
Part part = null; // 保存文件对象的临时变量
String originalFileName = null; // 上传文件的文件名称
String destfile = "D:\\"; // 文件在服务器上的物路径


while (itempart.hasNext()) {
part = itempart.next();
originalFileName = part.getSubmittedFileName();
logger.debug("servlet上传的文件名为:" + originalFileName);
destfile += originalFileName;
// 将文件写入到服务器路径中
part.write(destfile);
// 重置destfile路径
destfile = "D:\\";
}
}
return result;
}


}

猜你喜欢

转载自blog.csdn.net/jialijuan521_zhang/article/details/79779874