1. 程式人生 > >在SpringMVC框架中實現檔案上傳和下載

在SpringMVC框架中實現檔案上傳和下載

首先在springmvc.xml中配置檔案上傳的屬性

    <!-- 檔案上傳的屬性值 -->
     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8"></property>
        <property name="maxUploadSize" value="10485760000"
>
</property> <property name="maxInMemorySize" value="40960"></property> <property name="uploadTempDir" value="/WEB-INF/tmp"></property> </bean>

pom.xml檔案中加入上傳元件的jar

        <!--檔案上傳-->
        <dependency>
            <groupId>
commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>

這兩個xml檔案配置完成之後,我們就可以開始來寫我們的前端頁面和後端的控制器程式碼了。

我們知道後臺接受的類是MultipartFile,我們首先來封裝一個檔案上傳的工具類,將檔案上傳到系統的指定目錄下

package com.test.utils;

import
com.test.helper.BaseHelper; import org.springframework.web.multipart.MultipartFile; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; /** * 檔案上傳工具類. * * @author 張俊強~. * @date 2017/11/15-17:27. */ public class FileUploadUtils { //目前檔案上傳的路徑 public static final String tmpFilePath="F:\\temp\\"; public static BaseHelper uploadFile(MultipartFile file){ BaseHelper baseHelper=new BaseHelper(); if (!file.isEmpty()) { String fileName=file.getOriginalFilename(); try { byte[] bytes = file.getBytes(); BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(new File(FileUploadUtils.tmpFilePath+fileName))); stream.write(bytes); stream.close(); } catch (Exception e) { e.printStackTrace(); baseHelper.setCode(StatusInfoUtils.FAILCODE); baseHelper.setMsg(StatusInfoUtils.UPLOADFAIL); } } else { baseHelper.setCode(StatusInfoUtils.FAILCODE); baseHelper.setMsg(StatusInfoUtils.NOFILEFOUND); } return baseHelper; } }

上面的程式碼就可以實現檔案的儲存了。
下面我們來看看單檔案上傳多檔案上傳的功能如何實現吧!

單檔案上傳

前臺表單程式碼

<%----------------單檔案上傳-----------------%>
<form method="POST" enctype="multipart/form-data" action="fileOperation/fileUpload">
    選擇檔案: <input type="file" name="file"><br/>
    <input type="submit" value="上傳">
</form>

後臺業務處理程式碼

    /**
     * 單檔案的上傳.
     *
     * @param  file 待上傳的檔案
     * @return 檔案上傳的返回資訊
     */
    @ResponseBody
    @RequestMapping(value = {"fileUpload"})
    public BaseHelper fileUploadOperation(@RequestParam("file") MultipartFile file) {

        BaseHelper baseHelper= FileUploadUtils.uploadFile(file);
        return baseHelper;
    }

多檔案上傳

前臺表單程式碼

<%------------多檔案上傳--------------%>
<form method="POST" enctype="multipart/form-data" action="fileOperation/mulFileUpload">
    <p>
        選擇檔案:<input type="file" name="files">
    <p>
        選擇檔案:<input type="file" name="files">
    <p>
        選擇檔案:<input type="file" name="files">
    <p>
        <input type="submit" value="上傳">
</form>

後臺處理程式碼

    /**
     * 多檔案的上傳.
     *
     * @param  files 待上傳的檔案組
     * @return 檔案上傳的返回資訊
     */
    @ResponseBody
    @RequestMapping(value = {"mulFileUpload"})
    public BaseHelper mulFileUploadOperation(@RequestParam("files") MultipartFile[] files) {

        BaseHelper baseHelper=new BaseHelper();
        if (files.length>0) {
            for(MultipartFile file:files){
                baseHelper=FileUploadUtils.uploadFile(file);
            }
        } else {
            baseHelper.setCode(StatusInfoUtils.FAILCODE);
            baseHelper.setMsg(StatusInfoUtils.NOFILEFOUND);
        }
        return  baseHelper;
    }

以上就是有關檔案上傳的功能的實現了,其中的BaseHelperStatusInfoUtils的工具類程式碼如下

BaseHelper程式碼

package com.test.helper;

/**
 * 一些基本的返回的資訊狀態.
 *
 * @author 張俊強~.
 * @date 2017/11/12-10:14.
 */
public class BaseHelper {

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    private String code="SUCCESS";  //預設是成功

    @Override
    public String toString() {
        return "BaseHelper{" +
                "code='" + code + '\'' +
                ", msg='" + msg + '\'' +
                '}';
    }

    private String msg="操作成功";   //預設是操作成功
}

StatusInfoUtils的工具類程式碼

package com.test.utils;

/**
 * 一些狀態資訊的靜態類.
 *
 * @author 張俊強~.
 * @date 2017/11/12-10:25.
 */
public final class StatusInfoUtils {
    private StatusInfoUtils(){}//增強其不可例項化的能力 最好再私有構造器類拋異常
    //返回狀態資訊
    public static final String SUCCESSCODE="SUCCESS";
    public static final String SUCCESSMSG="操作成功";
    public static final String FAILCODE="FAIL";
    public static final String FAILMSG="操作失敗";
    //檔案上傳狀態資訊
    public static final String UPLOADSUCCESS="上傳成功";
    public static final String UPLOADFAIL="上傳失敗";
    public static final String NOFILEFOUND="未選擇檔案";
}

關於檔案下載,有兩種方法,一種是通過OutputStream寫出位元組,還有一種是通過PrintWriter 寫出字元。

通過OutputStream寫出位元組

    /**
     * Download file by output stream.
     *
     * @param response the response
     * @param realPath the real path
     * @throws FileNotFoundException the file not found exception
     * @throws IOException           the io exception
     */
    public static void downloadFileByOutputStream(HttpServletResponse response, String realPath)
            throws FileNotFoundException, IOException {
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
        response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        response.setHeader("Content-Type","application/octet-stream");
        response.setHeader("Accept-Ranges","bytes");
        InputStream in = new FileInputStream(realPath);
        int len = 0;
        byte[] buffer = new byte[1024];
        OutputStream out = response.getOutputStream();
        //將FileInputStream流寫入到buffer緩衝區
        while ((len = in.read(buffer)) > 0) {
            //使用OutputStream將緩衝區的資料輸出到客戶端瀏覽器
            out.write(buffer, 0, len);
        }
        in.close();
    }

通過PrintWriter 寫出字元

    /**
     * Download file by print writer.
     *
     * @param response the response
     * @param realPath the real path
     * @throws FileNotFoundException the file not found exception
     * @throws IOException           the io exception
     */
    public static void downloadFileByPrintWriter(HttpServletResponse response, String realPath)
            throws FileNotFoundException, IOException {
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);

        response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        FileReader in = new FileReader(realPath);
        int len = 0;
        char[] buffer = new char[1024];
        PrintWriter out = response.getWriter();//獲取PrintWriter輸出流
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);//將緩衝區的資料輸出到客戶端瀏覽器
        }
        in.close();
    }

以上 2017-11-15 22:29 於上海
更新時間:2017-11-25 16:49 新增檔案下載程式碼

相關推薦

SpringMVC框架實現檔案下載

首先在springmvc.xml中配置檔案上傳的屬性 <!-- 檔案上傳的屬性值 --> <bean id="multipartResolver" class="org.springframework.web.multi

如何在基於Java的Web專案實現檔案下載

在Sevlet 3 以前,Servlet API中沒有支援上傳功能的API,因此要實現上傳功能需要引入第三方工具從POST請求中獲得上傳的附件或者通過自行處理輸入流來獲得上傳的檔案,我們推薦使用Apac

使用springMVC實現檔案下載檔案下載

接上一篇,檔案下載需要獲取下載檔案的儲存路徑,這裡只是手動填入,如果是在具體專案中,可以把檔名和上傳後的儲存路徑儲存在資料庫中。然後增加一個檔案列表的頁面展示檔名和檔案路徑,然後點選下載的時候把相應的

springmvc實現檔案下載

springmvc實現檔案上傳的步驟: 1.頁面上,通過input來準備file元件,該標籤,必須給定name屬性值(該name不能和實體類的屬性名一致)同時,要求form表單必須給定一個屬性:enctype="multipart/form-data"<form a

SSM框架+kindeditor實現檔案圖片回顯

富文字編輯器為客戶資料編輯帶來很大遍歷,很多新同學卻不能實現其內帶的檔案上傳,不能發揮其最大功能。這裡使用SSM框架結合kindeditor實現其檔案上傳和圖片回顯功能。 SSM框架(版本不重要) Ki

ASP.NET實現檔案下載

###### 本文的開發配置 ###### .NET版本:.NET Framework 4.0 開發環境:Microsoft Visual Studio 2013 瀏覽器:IE、Chrome、FireFox等都行   1、搭建網站結構 建立一個新的目錄

Java實現檔案下載

上面的博文我寫了Java對檔案操作的功能https://blog.csdn.net/qq_24380635/article/details/83273359,這次記錄一下檔案上傳和下載的功能。看看兩者有什麼不同,就可以知道檔案操作和檔案上傳下載有什麼不同了。我也是一點點懂,也

Android Retrofit2.0實現檔案下載

這篇主要介紹retrofit框架的上傳檔案到伺服器和從伺服器下載功能的實現 上傳檔案到伺服器 首先 retrofit2.0之前上傳檔案到伺服器需要一個叫TypedFile這個類,但是在2.0版本,這個類被取消了,因為2.0以後,retrofit內部集成了okhttp

JavaWeb檔案下載

對於檔案上傳,瀏覽器在上傳的過程中是將檔案以流的形式提交到伺服器端的,如果直接使用Servlet獲取上傳檔案的輸入流然後再解析裡面的請求引數是比較麻煩,所以一般選擇採用apache的開源工具common-fileupload這個檔案上傳元件。這個common-fileupl

spring實現檔案下載 完整方案

1. 簡介 提供基於spring實現檔案(筆記附件)的上傳和下載的完整方案。方案將檔案上傳,並將檔名稱作為欄位與關聯的筆記繫結在一起,更新筆記在資料庫中的記錄。顯示筆記時,根據筆記所繫結的檔名生成下載

SpringBoot實現檔案下載

SpringBoot後臺如何實現檔案上傳下載? 最近做的一個專案涉及到檔案上傳與下載。前端上傳採用百度webUploader外掛。有關該外掛的使用方法還在研究中,日後整理再記錄。本文主要介紹SpringBoot後臺對檔案上傳與下載的處理。 單檔案上傳 // 單檔案上傳 @RequestMapp

Retrofit實現檔案下載【二】

概述 通過前一篇的部落格介紹,我們已經對Retrofit的使用有了一個大概的瞭解,今天來講講利用Retrofit進行檔案的上傳和下載 檔案上傳 伺服器使用的是SSH框架,因此這裡是以struts2的方式來獲取資料的,我這裡定義了三個欄位用來接收上傳過來

基於tobato的fastdfs與spring boot整合實現檔案下載

專案結構: pom.xml檔案新增配置: <!-- fastdfs --> <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastd

spring實現檔案下載完整方案

1. 簡介 提供基於spring實現檔案(筆記附件)的上傳和下載的完整方案。方案將檔案上傳,並將檔名稱作為欄位與關聯的筆記繫結在一起,更新筆記在資料庫中的記錄。顯示筆記時,根據筆記所繫結的檔名生成下載路徑,提交給服務端完成下載。 2. 檔案上傳 2. 1 前端 在html中插入一個表單用於提交檔案 &

七、springBoot 簡單優雅是實現檔案下載

前言 好久沒有更新spring Boot 這個專案了。最近看了一下docker 的知識,後期打算將spring boot 和docker 結合起來。剛好最近有一個上傳檔案的工作呢,剛好就想起這個腳手架,將檔案上傳和下載整理進來。 配置 在application.properties 中增加上傳檔案存放的路徑配

系列五、springMVC實現檔案跨伺服器檔案

一、實現檔案上傳 專案目錄如下所示 一、匯入依賴和配置springmvc.xml、web.xml 這個兩個jar

SpringMVC檔案下載

1. 檔案上傳 SpringMVC通過MultipartResolver來實現檔案上傳,預設沒有裝配,使用MultipartResolver需要加上commons-fileupload這個jar包。 1.1 配置MultipartResolver <!--配置上傳檔案控制元

Spring MVC檔案下載

檔案上傳 檔案上傳需將表格的提交方式設為"POST",並且將enctype設為"multipart/form-data",以二進位制的方式提交資料。 spring mvc中可通過MultipartResolver監聽每個請求,如有上傳的檔案,則把請求封裝為MultipartH

SpringBoot實現檔案訪問

用springboot實現檔案的上傳和訪問。檔案的上傳首先會用到相關的工具類,Jar包, Maven專案需要jar包: <!-- https://mvnrepository.com/artifact/commons-io/commons-io    IO 檔案流需要

MAC使用rzsz實現伺服器之前的檔案下載

開發人員在開發時有時會遇到需要在本機和開發機之間傳檔案的問題。雖然Mac下的scp命令可以完成檔案的上傳和下載功能,但如果開發機的登陸需要經過跳板機時,scp命令就沒有辦法正常使用了。 Window上可以用rx,sz命令上傳,下載檔案,Mac下也可以。下面介紹一下Mac O