记录-spring MultipartFile 文件上传
注意:以下上传和下载方法未必完全正确,不同浏览器效果不同,建议不要使用IE
/**
* 简单的文件上传
* @author:qiuchen
* @createTime:2012-6-19
* @param request
* @param response
* @param errors
* @return
* @throws Exception
*/
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ModelAndView onSubmit(HttpServletRequest request,HttpServletResponse response, BindException errors) throws Exception {
//上传文件处理器
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
//文件对象
CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest.getFile("file"); //从表单域中获取文件对象的详细,如:文件名称等等
String name = multipartRequest.getParameter("name");
System.out.println("name: " + name); // 获得文件名(全路径)
String realFileName = file.getOriginalFilename();
realFileName = encodeFilename(realFileName,request);
System.out.println("获得文件名:" + realFileName);
// 获取当前web服务器项目路径
String ctxPath = request.getSession().getServletContext().getRealPath("/")+ "fileupload/"; // 创建文件夹
File dirPath = new File(ctxPath);
if (!dirPath.exists()) {
dirPath.mkdir();
}
//创建文件
File uploadFile = new File(ctxPath + realFileName); //Copy文件
FileCopyUtils.copy(file.getBytes(), uploadFile); return new ModelAndView("success");
} /**
* 批量上传文件
* @author:qiuchen
* @createTime:2012-6-19
* @param request
* @param response
* @param errors
* @return
* @throws Exception
*/
@RequestMapping(value = "/upload2", method = RequestMethod.POST)
public ModelAndView onSubmit2(HttpServletRequest request,HttpServletResponse response, BindException errors) throws Exception {
//文件处理器
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
//文件列表
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
//获取服务器上传文件夹地址
String ctxPath = request.getSession().getServletContext().getRealPath("/")+ "\\" + "fileupload\\";
//创建文件夹
File file = new File(ctxPath);
if (!file.exists()) {
file.mkdir();
} String fileName = null;
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
//单个文件
MultipartFile mf = entity.getValue();
//文件名
fileName = mf.getOriginalFilename();
//创建文件
File uploadFile = new File(ctxPath + fileName);
//copy从内存中复制到磁盘上
FileCopyUtils.copy(mf.getBytes(), uploadFile);
}
return new ModelAndView("success");
} /**
* 设置下载文件中文件的名称
* @param filename
* @param request
* @return
*/
public static String encodeFilename(String filename,HttpServletRequest request) {
/**
* 获取客户端浏览器和操作系统信息 在IE浏览器中得到的是:User-Agent=Mozilla/4.0 (compatible; MSIE
* 6.0; Windows NT 5.1; SV1; Maxthon; Alexa Toolbar)
* 在Firefox中得到的是:User-Agent=Mozilla/5.0 (Windows; U; Windows NT 5.1;
* zh-CN; rv:1.7.10) Gecko/20050717 Firefox/1.0.6
*/
String agent = request.getHeader("USER-AGENT");
try {
if ((agent != null) && (-1 != agent.indexOf("MSIE"))) { // IE浏览器
String newFileName = URLEncoder.encode(filename, "UTF-8");
newFileName = StringUtils.replace(newFileName, "+", "%20");
if (newFileName.length() > 150) {
newFileName = new String(filename.getBytes("GB2312"),
"ISO8859-1");
newFileName = StringUtils.replace(newFileName, " ", "%20");
}
return newFileName;
}
if ((agent != null) && (-1 != agent.indexOf("Mozilla"))) // 火狐浏览器
return MimeUtility.encodeText(filename, "UTF-8", "B");
return filename;
} catch (Exception ex) {
return filename;
}
} /**
* 文件下载
* @author:qiuchen
* @createTime:2012-6-19
* @param fileName
* @param request
* @param response
* @return
* @throws Exception
*/
@RequestMapping("/download/{fileName}")
public ModelAndView download(@PathVariable("fileName") String fileName,HttpServletRequest request, HttpServletResponse response)throws Exception {
request.setCharacterEncoding("UTF-8"); BufferedInputStream bis = null; //从文件中读取内容
BufferedOutputStream bos = null; //向文件中写入内容 //获得服务器上存放下载资源的地址
String ctxPath = request.getSession().getServletContext().getRealPath("/")+ "\\" + "fileupload\\";
//获得下载文件全路径
String downLoadPath = ctxPath + fileName;
System.out.println(downLoadPath);
//如果文件不存在,退出
File file = new File(downLoadPath);
if(!file.exists()){
return null;
}
try {
//获得文件大小
long fileLength = new File(downLoadPath).length();
System.out.println(new String(fileName.getBytes("utf-8"), "ISO-8859-1"));
response.setContentType("text/html;charset=utf-8"); //设置相应类型和编码
response.setHeader("Content-disposition", "attachment;filename=" + new String(fileName.getBytes("utf-8"), "ISO-8859-1"));
response.setHeader("Content-Length", String.valueOf(fileLength)); bis = new BufferedInputStream(new FileInputStream(downLoadPath));
bos = new BufferedOutputStream(response.getOutputStream());
//定义文件读取缓冲区
byte[] buff = new byte[2048];
int bytesRead;
//把下载资源写入到输出流
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
return null;
} 对于正在复制代码的你,Control+O导入命名包时,以下应该是你喜欢的:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.BindException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.servlet.ModelAndView;
import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility;
原文出处:http://871421448.iteye.com/blog/1564287
记录-spring MultipartFile 文件上传的更多相关文章
- Spring MVC 笔记 —— Spring MVC 文件上传
文件上传 配置MultipartResolver <bean id="multipartResolver" class="org.springframework.w ...
- spring实现文件上传(图片解析)
合抱之木,生于毫末,千里之行,始于足下,要想了解spring的文件上传功能,首先要知道spring是通过流的方式将文件进行解析,然后上传.那么是不是所有需要用的文件上传的地方都要写一遍文件解析器呢? ...
- Spring MVC文件上传教程 commons-io/commons-uploadfile
Spring MVC文件上传教程 commons-io/commons-uploadfile 用到的依赖jar包: commons-fileupload 1.3.1 commons-io 2.4 基于 ...
- springboot成神之——spring的文件上传
本文介绍spring的文件上传 目录结构 配置application DemoApplication WebConfig TestController 前端上传 本文介绍spring的文件上传 目录结 ...
- 【Java Web开发学习】Spring MVC文件上传
[Java Web开发学习]Spring MVC文件上传 转载:https://www.cnblogs.com/yangchongxing/p/9290489.html 文件上传有两种实现方式,都比较 ...
- Spring mvc文件上传实现
Spring mvc文件上传实现 jsp页面客户端表单编写 三个要素: 1.表单项type="file" 2.表单的提交方式:post 3.表单的enctype属性是多部分表单形式 ...
- Spring Boot 文件上传原理
首先我们要知道什么是Spring Boot,这里简单说一下,Spring Boot可以看作是一个框架中的框架--->集成了各种框架,像security.jpa.data.cloud等等,它无须关 ...
- spring boot文件上传、下载
主题:Spring boot 文件上传(多文件上传)[从零开始学Spring Boot]http://www.iteye.com/topic/1143595 Spring MVC实现文件下载http: ...
- Spring MVC文件上传出现错误:Required MultipartFile parameter 'file' is not present
1.配置文件上传的解析器 首先需要在spring mvc的配置文件中(注意是spring mvc的配置文件而不是spring的配置文件:applicationContext.xml)配置: sprin ...
随机推荐
- 【Hadoop】Hadoop 机架感知配置、原理
Hadoop机架感知 1.背景 Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份, 同机架内其它某一节点上一份,不同机架的某一节点上一份. 这样如果本地 ...
- 网络相关系列之中的一个:Android中使用HttpClient发送HTTP请求
一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 "超文本传输协议",是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议,是 ...
- Android 百度地图 简单实现--- 美食搜索
Android 百度地图 简单实现--- 美食 依赖包: 加入 Android 百度依赖包: 1 key: <!-- 开发人员 key --> <meta-dat ...
- hdu 4630 No Pain No Game(线段树+离线操作)
No Pain No Game Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Angular 学习笔记——表单验证
<!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...
- Android学习(二十)Notification通知栏
一.通知栏的内容 1.图标 2.标题 3.内容 4.时间 5.点击后的相应 二.如何实现通知栏 1.获取NotificationManager. 2.显示通知栏:notify(id,notificat ...
- JavaScript对象按值传递
1.示例 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF- ...
- 怎么以最新汇率牌价计算XX美元相当于多少人民币
http://www.meiguozhuji.com/exchange-rate 美国主机都是以美元来报价的,至于XX美元相当于多少人民币,很多朋友都不太清楚.为了让大家更直接的了解购买美国主机需要花 ...
- NSNotification的几点说明
1.NSNotification消息的同步性 ①NSNotification使用的是同步操作.即如果你在程序中的A位置post了一个NSNotification,在B位置注册了一个observer,通 ...
- IIS7应用程序池集成和经典的区别 对IIS7经典模式和集成模式的理解 程序池经典和集成的区别
IIS7应用程序池集成和经典的区别 IIS7应用程序池集成和经典的区别 IIS7应用程序池有集成和经典两种模式,根据微软官方的介绍, 集成模式,如果托管应用程序在采用集成模式的应用程序池中运行,服 ...