【springmvc】springmvc中如何上传文件

使用到的组件:可自行根据情况选择版本

<!--上传依赖包-->
            <dependency>
                <groupId>commons-fileupload</groupId>
                <artifactId>commons-fileupload</artifactId>
                <version>1.3.2</version>
            </dependency>
            <!--commons-upload依赖包begin-->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.5</version>
            </dependency>
            <!--commons-upload依赖包END-->

xx-servlet.xml文件配置

<!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->
    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--默认编码为ISO-8859-1-->
        <property name="defaultEncoding" value="UTF-8"/>
        <!--上传大小限制为100MB,maxUploadSize配置的是字节数-->
        <property name="maxUploadSize" value="104857600"/>
        <!--Set the maximum allowed size (in bytes) before uploads are refused-->
        <property name="maxInMemorySize" value="40960"/>
        <!--uploadTempDir上传文件的临时路径,文件上传完后,临时目录中的临时文件会被自动清除-->
        <property name="uploadTempDir" value="fileUpload/temp"/>
    </bean>

tips:关于uploadTempDir,需要创建WEB-INF/fileUpload/temp这两个文件夹;因为程序不会自动创建,如果不创建,会直接报错;至于叫什么,层级如何,根据自己情况可修改;

maxUploadSize:配置的是字节数;maxInMemorySize:Set the maximum allowed size (in bytes) before uploads are refused

如果在上传过程中,乱码,可以在web.xml中配置如下filter,指定编码格式为utf-8;

    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!--支持异步-->
        <async-supported>true</async-supported>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

前端HTML:

如果想一次选择多文件上传,可以设置 multiple;  一次上传一个文件的话,不设置这个属性;

另外,enctype="multipart/form-data" 是必须设置的;

<form name="Form2" action="/rest/upload/springUpload" method="post" enctype="multipart/form-data">
    <h1>使用spring mvc提供的类的方法上传文件</h1>
    <input type="file" name="file" multiple="multiple">
    <input type="submit" value="upload"/>
</form>

后台代码:

    /*
     *采用spring提供的上传文件的方法
     */
    @RequestMapping(value = "springUpload", method = RequestMethod.POST)
    public ModelAndView springUpload(HttpServletRequest request) throws IllegalStateException, IOException {
        long startTime = System.currentTimeMillis();
        //将当前上下文初始化给  CommonsMultipartResolver (多部分解析器)
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext());
        //检查form中是否有enctype="multipart/form-data"
        if (multipartResolver.isMultipart(request)) {
            //将request变成多部分request
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            //获取multiRequest 中所有的文件名
            Iterator fileNames = multiRequest.getFileNames();

            // 上传文件夹是否存在,不存在创建;最终格式为/uploadFile/2017-06-01/{文件名}
            String realPath = request.getSession().getServletContext().getRealPath("/uploadFile/") + DateTimeUtils.getNow().toString();
            File pathFile = new File(realPath);
            if (!pathFile.exists()) {
                pathFile.mkdirs();
            }

            while (fileNames.hasNext()) {
                //一次遍历所有文件
                List<MultipartFile> fileList = multiRequest.getFiles(fileNames.next().toString());
                if (fileList != null) {
                    for (MultipartFile file : fileList) {
                        String path = realPath + "/" + file.getOriginalFilename();
                        System.out.println("上传路径:" + path);
                        //上传
                        file.transferTo(new File(path));
                    }
                }
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("运行时间:" + String.valueOf(endTime - startTime) + "ms");
        return new ModelAndView("fileupload/success");
    }

最终效果:

参考:

# 关于CommonsMultipartResolver配置

https://docs.spring.io/spring/docs/1.2.x/javadoc-api/org/springframework/web/multipart/commons/CommonsMultipartResolver.html

http://www.cnblogs.com/fjsnail/p/3491033.html # 有个问题,就是方法三种并没有解决一次上传多个资源时的情况;

时间: 2024-12-16 09:54:56

【springmvc】springmvc中如何上传文件的相关文章

SpringMvc (注解)中的上传文件

第一步:导入commons-fileupload-1.3.1.jar 和commons-io-2.2.jar 架包 第二步:在applicationContext.xml中 配置 <bean id=”multipartResolver” class=”org.springframework.web.multipart.commons.CommonsMultipartResolver”/> 第三步:在页面 <form>标签添加属性enctype=”multipart/form-dat

java开发中截取上传文件的文件名和后缀名

java开发中截取上传文件的文件名和后缀名 /** * Return the extension portion of the file's name . * * @see #getExtension */ public static String getExtension(File f) { return (f != null) ? getExtension(f.getName()) : ""; } public static String getExtension(String f

使用Ajax.BeginForm 中需要 上传文件 但 Request.files获取不到

使用Mvc里的插件jquery.unobtrusive-ajax.min.js 之前一直困在这里,一开始以为添加属性enctype="multipart/form-data"就可以 网上看到都是用另外一个插件jquery.form.js 于是,从某篇文章的附件中下载了jquery.form.js,弄了许久,还不行,顿时泪崩了, 最后在官网下载最新的jquery.form.js就解决了  ==|| 使用Ajax.BeginForm 中需要 上传文件 但 Request.files获取不到

asp.net中fileupload上传文件的方法

FileUpload 控件显示一个文本框控件和一个浏览按钮,使用户可以选择客户端上的文件并将它上载到 Web 服务器.用户通过在控件的文本框中输入本地计算机上文件的完整路径(例如,C:\MyFiles\test.txt)来指定要上载的文件.用户也可以通过单击“浏览”按钮,然后在“选择文件”对话框中定位文件来选择文件. 用户选择要上载的文件后,FileUpload 控件不会自动将该文件保存到服务器.您必须显式提供一个控件或机制,使用户能提交指定的文件.例如,可以提供一个按钮,用户单击它即可上载文件

MVC中如何上传文件

本文导读:在MVC中实现文件上传与传统的WebForm上传文件方法都差不多,在cshtml视图页面放一个file标签,然后在actionname方法中处理用户上传的文件.下面简单介绍MVC中上传文件的方法. 一.MVC中如何上传文件 1.在Web Forms中,当你把一个FileUpload控件拖到设计器中,你或许没有注意到在生成的HTML中会在form标签中加入一条额外属性 enctype="multipart/form-data". 而FileUpload控件本身会生成为<i

springMVC+spring+hibernate注解上传文件到数据库,下载,多文件上传

数据库 CREATE TABLE `annex` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `realName` varchar(36) DEFAULT NULL, `fileContent` mediumblob, `handId` bigint(20) DEFAULT NULL, `customerId` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_id` (`handId`), CON

(H5)FormData+AJAX+SpringMVC跨域异步上传文件

最近都没时间整理资料了,一入职就要弄懂业务,整天被业务弄得血崩. 总结下今天弄了一个早上的跨域异步上传文件.主要用到技术有HTML5的FormData,AJAX,Spring MVC. 首先看下上传页面: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script type="text/javascript" src="js/plugins/

Android应用开发中webview上传文件的几种思路

1. 常规方法,重写WebChromeClient 的 openFileChooser 方法 private class MyWebChromeClient extends WebChromeClient { // For Android 3.0+ public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { if (mUploadMessage != null) return; mUploadMe

Juploader 1.0 谷歌(chrome)浏览器中成功上传文件后返回信息异常

在项目中使用了Juploader 1.0无刷新上传文件的js组件,在IE8以上没有问题,代码如下: function InitialUploadDirectly(OnUploadFunc, buttonID, allowedExts) { $.jUploader({ button: buttonID, // 这里设置按钮id eventType: 1, //触发类型 addeventbutton: buttonID, // 要绑定事件的元素的id filenamed: buttonID + 'd