您的位置:首页 > 编程语言 > Java开发

java web 多文件上传和下载

2016-09-05 21:12 459 查看
Java web文件的上传和下载分两种情况,使用springmvc框架和直接使用servlet。这两种处理方式有所不同,是因为springMVC在处理文件上传的时候,对请求的request和response经过了处理。但这两种方式都需要引入文件上传包commons-fileupload和commons-io。

<dependency>
<groupid>commons-fileupload</groupid>
<artifactid>commons-fileupload</artifactid>
<version>1.3.1</version>
</dependency>
<dependency>
<groupid>commons-io</groupid>
<artifactid>commons-io</artifactid>
<version>2.4</version>
</dependency>


1、servlet处理问价上传

     
public void doGet(HttpServletRequest request, HttpServletResponse response){
Map<string string=""> retMap = new HashMap<string string="">();
try {
String path = request.getServletContext().getRealPath("/upload");
File file = new File(path);
if (!file.exists() && !file.isDirectory()) {
logger.info("no folder and make a folder now");
file.mkdir();
}

// 1、创建一个DiskFileItemFactory工厂,可以清理临时文件
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置临时目录
factory.setRepository(new File(path));
// 2、创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
//设定文件大小
upload.setSizeMax(1000000 * 20);
// 解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");

// 3、判断提交上来的数据是否是上传表单的数据
if (!ServletFileUpload.isMultipartContent(request)) {
// 按照传统方式获取数据,直接返回
return;
}
// 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<fileitem>集合,每一个FileItem对应一个Form表单的输入项
List<fileitem> list = upload.parseRequest(request);
String itemNo = "";
for (FileItem item : list) {
//如果fileitem中封装的是普通输入项的数据
if (item.isFormField()) {
if ("itemNo".equals(item.getFieldName())) {
itemNo = item.getString();
}
} else {
String filename = item.getName();
if (filename == null || filename.trim().equals("")) {
continue;
}
// 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename = filename.substring(filename.lastIndexOf("\\") + 1);
// 获取item中的上传文件的输入流
InputStream in = item.getInputStream();
FileOutputStream out = new FileOutputStream(path + "\\" + filename);
byte buffer[] = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.close();
out.flush();
// 删除处理文件上传时生成的临时文件
item.delete();
retMap.put("isSucc", "SUCC");
}
}
} catch (Exception e) {
e.printStackTrace();
}
return ;
}

</fileitem></fileitem></string></string>


  简单说来就是直接从request中取获取输入集合,然后判断输入集合是不是文件。

2、springmvc上传文件

     springmvc上传文件的时候,需要在springmvc的配置文件中配置文件解析器,具体的配置可有:

    
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="maxUploadSize" value="32505856"><!-- 上传文件大小限制为31M,31*1024*1024 -->
<beans:property name="maxInMemorySize" value="4096">
</beans:property></beans:property></beans:bean>


    1)利用CommonsMultipartFile对象直接获取

@RequestMapping("/upfile1")
public String up1(@RequestParam("file") CommonsMultipartFile[] files, HttpServletRequest request, HttpServletResponse response) {

String path = request.getServletContext().getRealPath("/static/upload1");
File file = new File(path);
if (!file.exists() && !file.isDirectory()) {
logger.info("no folder and make a folder now");
file.mkdir();
}

if (files != null && files.length > 0) {
for (int i = 0; i < files.length; i++) {
if (!files[i].isEmpty()) {
try {
String fileName = files[i].getOriginalFilename();
// 拿到上传文件的输入流
FileInputStream in = (FileInputStream) files[i].getInputStream();
File targetFile = new File(path, fileName);
FileOutputStream out = new FileOutputStream(targetFile);
byte buffer[] = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("上传出错");
}
}
}
}

try {
//
String url = request.getRequestURL().toString();
url = url.substring(0, url.indexOf('/', url.indexOf("//") + 2));
//request.getRequestDispatcher(url+"/upload/showPic").forward(request, response);
//response.sendRedirect(url+"/upload/");
} catch (Exception e) {
e.printStackTrace();
}

return "success";
}


2) 利用多部分部解析器CommonsMultipartResolver

  
@RequestMapping("/upfile2")
public String up1(HttpServletRequest request, HttpServletResponse response)
throws Exception, IOException {
String path = request.getServletContext().getRealPath("/static/upload1");
File file = new File(path);
if (!file.exists() && !file.isDirectory()) {
logger.info("no folder and make a folder now");
file.mkdir();
}
// 创建一个通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
// 判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
// 转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 取得request中的所有文件名
Iterator<string> iter = multiRequest.getFileNames();
while (iter.hasNext()) {
// 记录上传过程起始时的时间,用来计算上传时间
int pre = (int) System.currentTimeMillis();
// 取得上传文件
MultipartFile mfile = multiRequest.getFile(iter.next());
if (mfile != null) {
// 取得当前上传文件的文件名称
String fileName = mfile.getOriginalFilename();
// 如果名称不为“”,说明该文件存在,否则说明该文件不存在
if (fileName.trim() != "") {
File targetFile = new File(path, fileName);
System.out.println(targetFile);

//mfile.transferTo(targetFile);
// 拿到上传文件的输入流
FileInputStream in = (FileInputStream) mfile.getInputStream();
FileOutputStream out = new FileOutputStream(targetFile);
byte buffer[] = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.flush();
out.close();
}
}
// 记录上传该文件后的时间
int finaltime = (int) System.currentTimeMillis();
System.out.println(finaltime - pre);
}

}
return "/success";
}
</string>


具体的上传样式可有:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mvc Java应用