当前位置:首页 » 文件管理 » multipartfile上传

multipartfile上传

发布时间: 2022-12-11 05:02:35

‘壹’ Springmvc的几种多附件上传方式

1.单文件上传

1.1、页面

文件上传需要将表单的提交方法设置为post,将enctype的值设置为”multipart/form-data”。

<form action="${pageContext.request.contextPath}/test/upload.do" method="post" enctype="multipart/form-data">
<input type="file" name="img"><br />
<input type="submit" name="提交">
</form>
1.2 控制器
@Controller
@RequestMapping("/test")
public class MyController {

@RequestMapping(value = "/upload.do", method = RequestMethod.POST)
// 这里的MultipartFile对象变量名跟表单中的file类型的input标签的name相同,
//所以框架会自动用MultipartFile对象来接收上传过来的文件,
//当然也可以使用@RequestParam("img")指定其对应的参数名称
public String upload(MultipartFile img, HttpSession session)
throws Exception {
// 如果没有文件上传,MultipartFile也不会为null,可以通过调用getSize()方法获取文件的大小来判断是否有上传文件
if (img.getSize() > 0) {
// 得到项目在服务器的真实根路径,如:/home/tomcat/webapp/项目名/images
String path = session.getServletContext().getRealPath("images");
// 得到文件的原始名称,如:美女.png
String fileName = img.getOriginalFilename();
// 通过文件的原始名称,可以对上传文件类型做限制,如:只能上传jpg和png的图片文件
if (fileName.endsWith("jpg") || fileName.endsWith("png")) {
File file = new File(path, fileName);
img.transferTo(file);
return "/success.jsp";
}
}
return "/error.jsp";
}
}
1.3springmvc.xml配置
<!-- 注意:CommonsMultipartResolver的id是固定不变的,一定是multipartResolver,不可修改 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 如果上传后出现文件名中文乱码可以使用该属性解决 -->
<property name="defaultEncoding" value="utf-8"/>
<!-- 单位是字节,不设置默认不限制总的上传文件大小,这里设置总的上传文件大小不超过1M(1*1024*1024) -->
<property name="maxUploadSize" value="1048576"/>
<!-- 跟maxUploadSize差不多,不过maxUploadSizePerFile是限制每个上传文件的大小,而maxUploadSize是限制总的上传文件大小 -->
<property name="maxUploadSizePerFile" value="1048576"/>
</bean>
2.多文件上传

2.1页面
<form action="${pageContext.request.contextPath}/test/upload.do" method="post" enctype="multipart/form-data">
file 1 : <input type="file" name="imgs"><br />
file 2 : <input type="file" name="imgs"><br />
file 3 : <input type="file" name="imgs"><br />
<input type="submit" name="提交">
</form>
2.2控制器
@Controller
@RequestMapping("/test")
public class MyController {

@RequestMapping(value = "/upload.do", method = RequestMethod.POST)
// 这里的MultipartFile[] imgs表示前端页面上传过来的多个文件,imgs对应页面中多个file类型的input标签的name,
// 但框架只会将一个文件封装进一个MultipartFile对象,
// 并不会将多个文件封装进一个MultipartFile[]数组,直接使用会报[Lorg.springframework.web.multipart.MultipartFile;.<init>()错误,
// 所以需要用@RequestParam校正参数(参数名与MultipartFile对象名一致),当然也可以这么写:@RequestParam("imgs") MultipartFile[] files。
public String upload(@RequestParam MultipartFile[] imgs, HttpSession session)
throws Exception {
for (MultipartFile img : imgs) {
if (img.getSize() > 0) {
String path = session.getServletContext().getRealPath("images");
String fileName = img.getOriginalFilename();
if (fileName.endsWith("jpg") || fileName.endsWith("png")) {
File file = new File(path, fileName);
img.transferTo(file);
}
}
}
return "/success.jsp";
}
}
2.3springmvc.xml配置
<!-- 注意:CommonsMultipartResolver的id是固定不变的,一定是multipartResolver,不可修改 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 如果上传后出现文件名中文乱码可以使用该属性解决 -->
<property name="defaultEncoding" value="utf-8"/>
<!-- 单位是字节,不设置默认不限制总的上传文件大小,这里设置总的上传文件大小不超过1M(1*1024*1024) -->
<property name="maxUploadSize" value="1048576"/>
<!-- 跟maxUploadSize差不多,不过maxUploadSizePerFile是限制每个上传文件的大小,而maxUploadSize是限制总的上传文件大小 -->
<property name="maxUploadSizePerFile" value="1048576"/>
</bean>

扩展:
/*
* 通过流的方式上传文件
* @RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
*/

/*
* 采用file.Transto 来保存上传的文件
*/

/*
*采用spring提供的上传文件的方法
*/

‘贰’ spring multipartfile 怎么选择完文件直接上传

你文件上传用的什么方式,如果是submit直接提交的需要给form加一个属性:enctype="multipart/form-data",如果是异步提交则需要看你的上传控件的ID是否正确

‘叁’ multipart ile-MultipartFile上传文件时,中文文件名乱码怎么解决

现象:采用smartupload上传文件时获取文件名及相关参数()时乱码.
原因:上传文件的页面会以页面指定的编码格式对上传的数据进行编码,smartupload在接收数据时会以系统默认的编码解码上传数据,如果页面编码与系统编码不一致,则会导致乱码
解决:
1.指定页面编码与系统编码一致:<meta
http-equiv="Content-Type" content="text/html;
charset=utf-8">,对于windows操作系统应为gbk,对于linux,要指定为export|grep
LANG中一致的编码格式.
2.修改smartupload.jar中的SmartUpload.java中: String s11 = new
String(m_binArray, m_startData, (m_endData - m_startData) + 1);
和getDataHeader方法中类似部分,加入charSet参数,手动指定编码
这里已经有修改好的smartupload.jar包,只需在上传时指定编码参数即可:su.upload("UTF8");

‘肆’ String MultipartFile怎么实现带进度条的上传

MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
MultipartFile mulitFile=multiRequest.getFile(fileName);
if(mulitFile.getSize()==0){
throw new DataExistenceException("上传文件为空!");
}else{
ServletContext context=request.getSession().getServletContext();
//获得后缀
this.fileType=mulitFile.getOriginalFilename().substring(mulitFile.getOriginalFilename().lastIndexOf(".",mulitFile.getOriginalFilename().length()));
//验证后缀是否合法
this.picTypeValidate();
//验证文件(用于不符合文件自己改后缀名)
BufferedImage bufferedImage=ImageIO.read(mulitFile.getInputStream());
if(bufferedImage==null){
throw new DataExistenceException("上传文件后缀名与类型不符!");
}

‘伍’ multipartfile 文件上传前端怎么用div和ajax

目前的情况下,没有直接ajax提交file的可能 有一些js库你可以使用,他们做的方法往往是在页面新建一个iframe,然后在frame里面建一个file的input组件,然后在那个frame里面走submit 这样就做成了异步的样子,submit那个的form你就可以设置enctype了。
首先要说的就是 ajax 是无法实现上传文件的,可以想一下ajax与后台通信都是通过传递字符串,怎么能传递文件呢?其实出于安全考虑js是不能操作文件的,所以就不要再说用ajax来实现文件的上传了,这是不可能的。 而本文实现的文件上传也是无页面刷。

‘陆’ [FE] 用 FormData 上传多个文件到 MultipartFile[] 接口

最近有一个场景,在提交表单的时候,需要实现添加附件的功能,
表单内容要先提交到服务端,创建一个 issue,然后再将附件添加到这个 issue 中。

所以,附件在用户添加的时候,是 没有立即上传 的,
用户可以随意在浏览器端添加和删除,issue 创建后再一起上传。

前端采用的组件库是 antd ,用到了 upload 组件。
服务端接口是自定义实现的,也许并不支持 antd upload 上传组件的规范。

服务端接受数据时,使用了 MultipartFile ,这是 Spring 框架中常用的 写法 。

我们先看看 html input[type=file] 组件默认行为,

点击 “选择文件”,浏览器会弹出一个窗口,

选中一个文件,点 “打开”,就会触发 onchange 事件,

在 onchange 事件中,可以通过 e.target.files[0] 拿到刚才上传的那个 File 对象

再来看一下 upload 组件的默认行为,

点击 “添加”,浏览器也会弹出那个选择文件的窗口,

选中一个文件,点 “打开”,发现上传失败了。

打开控制台,看到 upload 组件向 / 这个地址发送了一个 POST 请求,

数据格式如下,

我们可以向 upload 组件传入 action 参数,修改 POST 请求地址,

但是,选中文件后立即上传 不符合 我们的场景,我们需要提交表单之后,将多个文件统一上传。
所以我们得自定义 upload 组件的行为。

upload 组件的有一个 customRequest 属性( #api ),
它可以配置自定义的上传行为。

我们的思路是,先将选中后自动上传的行为取消掉,然后再在提交表单后统一上传。
取消自动上传 的实现片段如下,

我们只需要在 customRequest 回调中,调用它的 onSuccess 参数即可。

删除也是可以用的,

现在我们添加两个附件,

接着来看前端怎样将这些附件,统一上传给服务端,具体实现如下,

可以看到请求成功了(项目中的 url 跟本例稍有不同,下图只为了示意),

还有几个需要注意的点:

上文 httpClient.post 实际调用了 XMLHttpRequest 发送请求,可能会遇到 跨域 的问题。
所以在调试上传接口的时候,需要检查一下服务端的配置,是否支持跨域请求。

CORS 相关的内容大致如下:

在预检请求阶段,服务端对 OPTIONS 请求的响应头中会包含 Access-Control-Allow-Origin ,

表明服务端接受该域 http://foo.example 的跨域请求。

注:
这里需要后端实现 OPTIONS 方法,后端框架一般会通过配置方式统一处理(返回 200 或 204,不能是 4xx)。
如果未配置统一处理方式,框架可能会直接返回 404 导致预检请求失败,CORS 请求也会失败。

使用 XMLHttpRequest 发送请求时,也可以携带 cookie 信息,

同时 预检请求中服务端响应头,也要包含 Access-Control-Allow-Credentials ,否则就不会发送 cookie

对于附带 cookie 的请求,服务器不能设置 Access-Control-Allow-Origin 的值为 “ * ”,否则请求将会失败。
而将 Access-Control-Allow-Origin 的值设置为具体的地址 http://foo.example ,请求才能成功。

我们上传功能用到了携带 cookie 的跨域请求,
可以看到服务端响应头中确实包含了, Access-Control-Allow-Credentials 和 Access-Control-Allow-Origin 两个字段。

Spring: Uploading Files
Spring: org.springframework.web.multipart #MultipartFile

ant-design v4.11.1
Ant Design - Upload #API

MDN: CORS

‘柒’ MultipartFile文件上传问题

那是后台写的逻辑问题,后台判断到有同名的,覆盖、不是另建。和前台无关了。

‘捌’ MultipartFile上传文件数据库保存进了但是target里面没有图片

这里,我只想总结一下我一下午研究文件上传,图片上传功能的思考。也许花费了很多时间,但还是觉得比较值的。

以前一直听说过“项目使用的所有图片应该保存在图片服务器上,”一直看过这样的代码:Java后端由各种流组成的处理图片或着文件的方法。当时其实都是朦胧的,似懂非懂的样子。现在或许是有那么的一点理解了:当项目或者具体说页面中存在大量的图片时,页面的加载可能会很慢,这时,可能就需要使用一个独立的服务器来专门的读取这些图片了, 所以才有了图片服务器的说法。(或许是这样)。

图片上传功能的具体实现(当然文件也一样):

总的来说是这样的, 我们在页面上通过按钮获取到某张图片后,会显示在页面上(如果你需要的话),显示的可以是图片本身,或者是图片的名字。然后通过ajax,把图片传到了Java后台,(以什么格式我还不清楚),根据我这一下午的实践,MultipartFile ,这个类可以完全接收到前台传过来的图片数据。,这里也许有人会问, 传到后台干嘛呢。假设你的前端调用的不是你本项目的Java后台代码,而是另外一个接口Api项目的话, 那么,其实,这个APi项目就可以当作一个图片服务器了。额,这里仅仅是临时保存了图片而已,就页面而言,如果是表单,你还需要提交表单。那么表单提交时,你还会保存图片吗?应该是存图片在服务器上的地址吧。

MultipartFile 通过 MultipartFile .transferTo( new File()), 仅需要这步骤,就可以把图片存到服务器所在的电脑的任意一个盘或者路径里面。 其实这个很简单,难是难在 文件的创建。(坑了我很久),

new File("d:/test1/test2/test3/demo.png"), 类似要创建这样的 File文件时, 你要先判断demo.png 的父级路径是否存在,如果不存在则要先创建。否则你也许会报一个错误,“java.io.FileNotFoundException 拒绝访问”.

也许废话说了很多,下面直接上示例代码, 本实例代码亲测有效可用。本实例 前端采用layui + 后端 springMVC+MultipartFile

页面.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>文件上传demo</title>
<%@include file="/comm/mytags.jsp" %>
</head>
<body>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>常规使用:普通图片

热点内容
如何把图片压缩到20k 发布:2025-08-01 06:18:44 浏览:812
安卓备份微信聊天记录在哪里 发布:2025-08-01 06:11:26 浏览:137
宝马新四系哪个配置好看 发布:2025-08-01 06:02:25 浏览:949
存储过程源码 发布:2025-08-01 05:47:28 浏览:940
图加字源码 发布:2025-08-01 05:45:55 浏览:564
长春舰访问 发布:2025-08-01 05:45:17 浏览:488
安卓手机资料怎么导苹果电脑 发布:2025-08-01 05:43:45 浏览:735
为什么用银行卡要输密码 发布:2025-08-01 05:43:44 浏览:288
买车要买什么配置性价比最高 发布:2025-08-01 05:43:42 浏览:640
如何更改手机的账户密码 发布:2025-08-01 05:40:05 浏览:715