(十二)springMvc 处理图片,视频等文件的上传
文章目录
导包
需要导入如下的包
commons-fileupload-1.3.3.jar
commons-io-2.6.jar
修改表单类型
想要上传图片、文本、电影、音乐等资源的时候,需要将 form 的类型改为 multipart/form-data
<form enctype="multipart/form-data">
配置解析器
在 springMvc.xml 文件中进行配置 ;
<!--配置图片、音乐等文件的解析器-->
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--限制上文最大为5M 1024*1024*5-->
<property name="maxInMemorySize">
<value>5242880 </value>
</property>
</bean>
处理上传的图片
springMvc 对这类型的数据,也支持 参数绑定 ,使用 MultipartFile 接收 ,注意页面上的 name 属性的值和形参名一致,老生常谈的事了;
MultipartFile 的一些基本操作 :
// 获取上传的文件名
String oldFile = multipartFile.getOriginalFilename() ;
// 将上传的文件,从内存中写到硬盘上
multipartFile.transferTo(path);
补充一个自己写的工具类
之前写的过于简单,补充下一个实例;
上传文件
先判断
HttpServletRequest是否是MultipartHttpServletRequest的实例,如果不是,则表示HttpServletRequest只是一个普通的request,并没有带文件过来,当然网上还有其他好几种判断方法,这是我常用的一种;public String upLoadExcel(HttpServletRequest request) {
JSONObject jsonObject = new JSONObject();
if (!(request instanceof MultipartHttpServletRequest)) {
jsonObject.put("result", "0");
jsonObject.put("resultInfo", "没有选中任何文件");
return jsonObject.toJSONString();
}
...
}
如果
HttpServletRequest是MultipartHttpServletRequest的实例,则进行强转,将HttpServletRequest转成MultipartHttpServletRequest的实例;然后获取上传的文件:首先说明下,上传的文件的情况,它是一个
Map中套List的情况。因此,获取文件,需要先获取外层的
Map,MultipartHttpServletRequest提供了获取其迭代器的方法:Iterator<String> iterator = request.getFileNames();
这样就获取了所有的文件名,注意下
Map里面套的是List因此,这些名字就是Map的键,一个键对应一个值List,就是说一个文件名可以对应多个文件。根据文件名获取其对应的
List:List<MultipartFile> files = request.getFiles(fileName);
这样就获取到了一个文件对应的
Lsit集合,再迭代这个List就可以获取其对应的文件。
下面是一个实例:
/**
* 文件上传
* <p>
* 先遍历名字,在根据名字遍历对应的文件,两层循环,ok!
*
* @param request 接受提交文件的 request
* @return 返回上传的文件的保存路径
*/
public static List<String> fileUpload(MultipartHttpServletRequest request) throws IOException {
List<String> paths = new ArrayList<>();
// String path = FileUpDownloadUtils.class.getClassLoader().getResource("UpDownLoad" + File.separator + "readme.txt").getPath();
// 当前web应用的绝对路径
// String path = request.getSession().getServletContext().getRealPath("/") + "UpDownLoad";
// 获取系统的路径
String path = File.separator + "UpDownLoad";
Iterator<String> iterator = request.getFileNames(); while (iterator.hasNext()) {
String fileName = iterator.next();
List<MultipartFile> files = request.getFiles(fileName);
if (files.size() > 0) {
ListIterator<MultipartFile> multipartFileListIterator = files.listIterator();
while (multipartFileListIterator.hasNext()) {
String uuid = UUID.randomUUID().toString();
String path_in = getPathByHashcode(path, uuid);
MultipartFile multipartFile = multipartFileListIterator.next();
StringBuilder builder = new StringBuilder();
builder.append(path_in + File.separator);
builder.append(uuid + "_");
builder.append(multipartFile.getOriginalFilename());
File file = new File(builder.toString());
paths.add(file.getAbsolutePath());
multipartFile.transferTo(file);
}
}
}
return paths;
}
再附送下代码中,我写的文件随机分配算法,这是其中的一种实现,只适合代码去读文件,人工找某个文件比较费劲,还有一种实现是按照日期分配;
日期分配,方便人工去拿文件,但是存在弱点,如果一天之内,有人暴力上传文件,文件夹就会被撑爆。各有各的优缺点。
/**
* 文件分配算法,根据UUid的值 算出文件保存的地址 ;
* <p>
* UUID 的长度是固定的,然后根据其长度,保证其生成的 hascode 的长度也是一样长的(32位) ;
* <p>
* 每四位取为一个int 值 ,最多可以取 8 层 ;
* <p>
* 可以保存 16 * 16 * 16 * 16 * 1000 = 4 096 000(四百万份合同) ;
*
* @param path
* @param uuid
* @return
*/
private static String getPathByHashcode(String path, String uuid) {
int hashcode = uuid.hashCode();
int one = hashcode & 0xf;
int two = (hashcode >> 4) & 0xf;
int three = (hashcode >> 4 >> 4) & 0xf;
int four = (hashcode >> 4 >> 4 >> 4) & 0xf; File file = new File(path +
File.separator + one + File.separator + two
+ File.separator + three + File.separator + four); if (!file.exists()) {
file.mkdirs();
} return file.getPath();
}
下载文件
导包都是导入
spring框架下面的,不要导错了。做了下载文件的时候,对文件名的兼容性,可以有空格。/**
* springMvc 的下载,原始的response的outputStream 怎么用的,都要忘记了 见鬼的框架,真香的封装
*
* @param imgPaths 封装需要下载的文件的路径
* @return
*/
public static ResponseEntity<Resource> fileDownload(String imgPaths, int blag) throws UnsupportedEncodingException { File file = new File(imgPaths);
String simpleName = imgPaths.substring(imgPaths.indexOf("_") + 1); Resource body = new FileSystemResource(file);
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.getRequestAttributes()).getRequest(); HttpStatus status = HttpStatus.CREATED; /**
* 对文件名进行处理下
*/
// 浏览器分为 火狐 和 非火狐
if (request.getHeader("USER-AGENT").toLowerCase().indexOf("firefox") >= 0) {
// 火狐头大,需要独特设置一下
simpleName = new String(simpleName.getBytes("UTF-8"), "iso-8859-1");
} else {
simpleName = URLEncoder.encode(simpleName, "UTF-8");
// IE 文件名有空格会被加号代替。需要自己替换回去
simpleName = simpleName.replaceAll("\\+", "%20");
} String suffix = simpleName.substring(simpleName.lastIndexOf(".") + 1);
HttpHeaders headers = new HttpHeaders();
switch (blag) {
/**
* 内嵌显示,针对IE浏览器:TEXT_PLAIN
* 文件名有空格。火狐则会截断文件名,需要将文件名用字符串包起来.使用 springMvc 不再需要这样做,并且你做了,还会在文件名前后各加一个 _ ;
*
* 预览需要自己判断下文件类型。
*
*/
case SHOW:
MediaType mediaType;
switch (suffix.toLowerCase()) {
case "png":
case "jpg":
case "gif":
mediaType = MediaType.TEXT_PLAIN;
break;
// case "html":
// case "xml":
// case "markdown":
// mediaType = MediaType.valueOf("text/" + suffix);
// break;
default:
mediaType = MediaType.valueOf("application/" + suffix); }
headers.setContentType(mediaType);
break;
/**
* 下载,下载设置内容格式为二进制数据:MediaType.APPLICATION_OCTET_STREAM
*/
case DOWNLOAD:
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", simpleName);
break;
} headers.setContentLength(file.length());
return new ResponseEntity<>(body, headers, status);
}
其中的常量是:
传入
0,就只是显示在浏览器上,不下载,这个只显示功能还有点问题,图片、pdf等格式会显示,一些其他格式无论怎么调试都是会下载。。。 ;1是下载。public static final int SHOW = 0;
public static final int DOWNLOAD = 1;
(十二)springMvc 处理图片,视频等文件的上传的更多相关文章
- 在SpringMVC框架下实现文件的 上传和 下载
在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ...
- SpringMVC+SwfUpload进行多文件同时上传
由于最近项目需要做一个多文件同时上传的功能,所以好好的看了一下各种上传工具,感觉uploadify和SwfUpload的功能都比较强大,并且使用起来也很方便.SWFUpload是一个flash和js相 ...
- SpringMVC + AJAX 实现多文件异步上传
转自:https://www.jianshu.com/p/f3987f0f471f 今天,我就这个问题来写一篇如何用 SpringMVC + AJAX 实现的多文件异步上传功能.基本的代码还是沿用上篇 ...
- 视频大文件分片上传(使用webuploader插件)
背景 公司做网盘系统,一直在调用图片服务器的接口上传图片,以前写的,以为简单改一改就可以用 最初要求 php 上传多种视频格式,支持大文件,并可以封面截图,时长统计 问题 1.上传到阿里云服务器,13 ...
- SpringMVC学习09(文件的上传和下载)
文件上传和下载 准备工作 文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况 ...
- 文件正在上传的转圈圈gif图片引出的fixed定位和absolute定位
文件正在上传的转圈圈gif图片 一.文件上传时,未上传返回成功状态之前给个gif动态图片显示在页面,改善用户体验. <!--S 遮罩层 --> <div id="mas ...
- SpringMVC听课笔记(十二:文件的上传)
1.Spring MVC为文件上传提供了直接的支持,这种支持是通过即插即用的MultipartResolver实现的.Spring用Jakarta Commons FileUpload技术实现了一个M ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——S ...
- (转)SpringMVC学习(十二)——SpringMVC中的拦截器
http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...
随机推荐
- python常用模块(不定期更新)
前言: 随着python开发项目越来越大,显然应该把不同功能的代码放到不同的.py文件里,每一个.py文件叫一个模块:模块分为(1)内置标准模块(2)第三方模块(3)自定义模块 这三种.这篇博客就是用 ...
- 初次Java web项目的建立以及与数据库的连接
题目要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分) 3性别:要求用单 ...
- c++ 容器反转并且拷贝到一个新容器中
// reverse_copy example #include <iostream> // cout #include <algorithm> // reverse_copy ...
- 运维自动化之ansible
Ansible简介 Ansible是一个简单的自动化运维管理工具,基于Python语言实现,由Paramiko和PyYAML两个关键模块构建,可用于自动化部署应用.配置.编排task(持续交付.无宕机 ...
- Linux之破解root密码
破解CentOs6的root口令 进入单用户模式 重启后在下面界面按任意键 进入此界面后“ a ”在下面界面 输入1 进入单用户模式1之前有空格 按回车键进入命令行执行passwd命令直接修 ...
- 【SpringBoot】整体下载大文件与分批下载大文件(利用MySql数据库的Limit实现)
在前文里谈过一次性从数据库取一个大结果集有可能导致outofMemory,当时的想法是分批去取回来,今天把它实现了,特地把代码分享出来: 工程下载:https://files.cnblogs.com/ ...
- iOS获取应用当前Caches目录路径以及当前日期
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSSt ...
- linux挂载iscsi出现的问题
挂载的时候我们可以使用永久挂载但是这里我们就需要注意了正常的永久挂载可能会导致系统起不来因为这里我们使用的是服务端的硬盘为网络设备而开机的读取中 会先读取/etc/fstab下的内容 之后再读取网络的 ...
- 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_2.RabbitMQ研究-RabbitMQ介绍
开发中消息队列通常有如下应用场景: 1.任务异步处理. 将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理.提高了应用程序的响应时间. 2.应用程序解耦合 MQ相当于一个中介,生产 ...
- String字符串的截取
根据某个字段将字符串分割成绩部分 String str = "string number one 1/9/0"; //将字符串由/ 截取成绩部分 String[] strs = s ...