记录-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 ...
随机推荐
- leetcode题解:Valid Palindrome(判断回文)
题目: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ig ...
- Linux如何查找大文件
https://www.cnblogs.com/kerrycode/p/4391859.html find . -type f -size +800M 如上命令所示,我们仅仅能看到超过800M大小的文 ...
- swftools使用
为了支持gif转swf以及pdf转swf.编译swftools过程中遇见几个问题,记录一下. 首先下载swftools:http://www.swftools.org/ 它依赖几个包,这里我使用的版本 ...
- A read-only user or a user in a read-only database is not permitted to disable
A read-only user or a user in a read-only database is not permitted to disable 出现如题的问题通常是由于db.lck的所属 ...
- Oracle11g登陆sqlplus时一直提示密码错误
我安装oracle的时候有自己设置帐号和密码,我也在服务里的oracleserver中查看了正在运行的用户名,是我注册时填的那个并已开启.但是为什么登陆Sqlplus老是说密码错误呢?我敢肯定密码没有 ...
- vue 访问子组件示例 或者子元素
1.子组件 <base-input ref="usernameInput"></base-input> this.$refs.usernameInput 2 ...
- Oracle创建表空间与用户
/* 说明:若已经存在相应的用户和表空间,则需要先删除相应的用户和表空间 然后再全部重新建立 */ --删除用户 drop user XDAYWEIXIN cascade; --删除表空间 drop ...
- 如何在 Linux 下大量屏蔽恶意 IP 地址
很多情况下,你可能需要在Linux下屏蔽IP地址.比如,作为一个终端用户,你可能想要免受间谍软件或者IP追踪的困扰.或者当你在运行P2P软件时.你可能想要过滤反P2P活动的网络链接.如果你是一名系统管 ...
- iOS项目开发之仿网易彩票推荐应用
简介 效果展示 思路分析 代码实现 Git地址 一.简介 某些公司有较多的产品时,通常会在一个产品中推广另外的一些产品,我简单的封装了一个UIControllerView,由于不同公司,要求不同.所以 ...
- C++ 输出100—999中所有的水仙花数
输出100-999中所有的水仙花数,若3位数xyz满足 , 则xyz为水仙花数,例如 , 因此153是水仙花数. #include <iostream> using namespace s ...