1. 程式人生 > >【springmvc】springmvc中如何上傳文件

【springmvc】springmvc中如何上傳文件

doc 問題 ffffff color 遍歷 -c tip int imu

使用到的組件:可自行根據情況選擇版本

<!--上傳依賴包-->
            <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 # 有個問題,就是方法三種並沒有解決一次上傳多個資源時的情況;

【springmvc】springmvc中如何上傳文件