1. 程式人生 > >從.Net到Java學習第十篇——Spring Boot檔案上傳和下載

從.Net到Java學習第十篇——Spring Boot檔案上傳和下載

圖片上傳

Spring Boot中的檔案上傳就是Spring MVC中的檔案上傳,將其整合進來了。

在模板目錄建立一個新的頁面 profile/uploadPage.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
<h2 class="indigo-text center"
>Upload</h2> <form th:action="@{/upload}" method="post" enctype="multipart/form-data" class="col m8 s12 offset-m2"> <div class="input-field col s6"> <input type="file" id="file" name="file"/> </div> <div class="col s6 center"> <button
class="btn indigo waves-effect waves-light" type="submit" name="save" >Submit <i class="mdi-content-send right"></i> </button> </div> <div class="col s12 center red-text" th:text="${error}" th:if="${error}"> Error during upload
</div> <div class="col m8 s12 offset-m2"> <img th:src="@{${picturePath}}" width="100" height="100"/> </div> </form> </body> </html>

除了表單中的 enctype 屬性以外,並沒有太多值得關注的。檔案將會通過 POST 方法傳送到 upload URL 上,新建控制器PictureUploadController

@Controller
@SessionAttributes("picturePath")
public class PictureUploadController {
    //跳轉到上傳檔案的頁面
    @RequestMapping("upload")
    public String uploadPage() {
        return "profile/uploadPage";
    }
    //處理檔案上傳
    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public String onUpload(MultipartFile file, HttpServletRequest request, RedirectAttributes redirectAttrs, Model model) throws IOException {
        if (file.isEmpty() || !isImage(file)) {
            redirectAttrs.addFlashAttribute("error", "Incorrect file.Please upload a picture.");
            return "redirect:/upload";
        }
        String filePath =  request.getSession().getServletContext().getRealPath("pictures/");
        Resource picturePath = copyFileToPictures(file,filePath);
        String _path="/pictures/"+picturePath.getFilename();
        model.addAttribute("picturePath",_path);
        return "profile/uploadPage";
    }

    private Resource copyFileToPictures(MultipartFile file,String filePath) throws IOException {
        String filename = file.getOriginalFilename();
        File tempFile = File.createTempFile("pic",
                getFileExtension(filename),  new FileSystemResource(filePath).getFile());
        try (InputStream in = file.getInputStream();
             OutputStream out = new FileOutputStream(tempFile)) {
            IOUtils.copy(in, out);
        }
        return new FileSystemResource(tempFile);
    }

    //判斷上傳檔案的型別是否是圖片
    private boolean isImage(MultipartFile file) {
        return file.getContentType().startsWith("image");
    }
    //獲取上傳檔案的副檔名
    private static String getFileExtension(String name) {
        return name.substring(name.lastIndexOf("."));
    }
}

在專案的根目錄下建立 pictures 目錄 ,上述程式碼做的第一件事情是在 pictures 目錄下建立一個臨時檔案,這個目錄位於專案的根資料夾下,所以要確保該目錄是存在的。在 Java 中,臨時檔案只是用來獲取檔案系統中唯一的檔案識別符號的,使用者可以自行決定是否要刪除它 。使用者提交的檔案將會以 MultipartFile 介面的形式注入到控制器中,這個介面提供了多個方法,用來獲取檔案的名稱、大小及其內容 。try...with 程式碼塊將會自動關閉流,即便出現異常也會如此,從而移除了finally 這樣的樣板式程式碼 。我們還可以定義上傳檔案的功能。

  • multipart.maxFileSize:這定義了所允許上傳檔案的最大容量。嘗試上傳更大的檔案將會出現 MultipartException,其預設值是 1Mb
  • multipart.maxRequestSize:這定義了整個 multipart 請求的最大容量,預設值10MB

執行預覽:

圖片下載

修改控制器PictureUploadController,新增如下程式碼:

   //圖片下載
    @RequestMapping(value = "/DownloadPic", method = RequestMethod.GET)
    public void Download(HttpServletRequest req,HttpServletResponse res) {
        String fileName = "pic2456280610589533697.jpg";
        res.setHeader("content-type", "application/octet-stream");
        res.setContentType("application/octet-stream");
        res.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        byte[] buff = new byte[1024];
        BufferedInputStream bis = null;
        OutputStream os = null;
        try {
            os = res.getOutputStream();
            String filePath =  req.getSession().getServletContext().getRealPath("pictures/");
            bis = new BufferedInputStream(new FileInputStream(new File(filePath + fileName)));
            int i = bis.read(buff);
            while (i != -1) {
                os.write(buff, 0, buff.length);
                os.flush();
                i = bis.read(buff);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("success");
    }

修改uploadPage.html,新增:

    <a href="/DownloadPic">下載圖片</a>

相關推薦

.Net到Java學習——Spring Boot檔案下載

圖片上傳 Spring Boot中的檔案上傳就是Spring MVC中的檔案上傳,將其整合進來了。 在模板目錄建立一個新的頁面 profile/uploadPage.html <!DOCTYPE html> <html xmlns:th="http://www.thymel

Spring Boot 檔案下載

前言:以前的專案中檔案上傳下載會寫大量程式碼來實現,但是在Spring Boot中,簡化了大量程式碼,上傳只需要2行程式碼即可 package com.demo.controller; import com.demo.model.FileInfo; import org.

struts2學習筆記五(15講.Struts2的檔案下載續三)

[/code][b][size=xx-large]Struts2的檔案上傳和下載續三[/size][/b][color=red]功能:[/color]使用者可以自定義上傳檔案的個數,如果新增的個數多了的話,還可以進行刪減。一、修改之前根目錄下的upload.jsp檔案:[co

Spring框架學習筆記(7)——Spring Boot 實現下載

最近忙著都沒時間寫部落格了,做了個專案,實現了下載功能,沒用到上傳,寫這篇文章也是順便參考學習瞭如何實現上傳,上傳和下載做一篇筆記吧 下載 主要有下面的兩種方式: 通過ResponseEntity實現 通過寫HttpServletResponse的OutputStream實現 我只測試了ResponseE

Spring Boot——檔案下載

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apac

Spring Boot 檔案下載

一、上傳檔案 @RequestMapping(value="/upfile", method = RequestMethod.POST) public ResultVo uploadFile(@Req

spring實現檔案下載 完整方案

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

spring實現檔案下載完整方案

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

.Net到Java學習——spring boot+mybatis+mysql

jar fig targe list pro ble TE png tween 環境:mysql5.7 新建mysql數據庫demo,然後執行如下sql腳本進行數據表創建和數據初始化: -- ---------------------------- -- Tabl

.Net到Java學習——spring boot+redis

“學習java已經十天,有時也懷念當初.net的經典,讓這語言將你我相連,懷念你......”接上一篇,本篇使用到的框架redis、FastJSON。 環境準備 安裝redis,下圖是我本機的redis綠色版,你可以網上自行下載安裝,如果不知道如何怎麼操作,可以移步到我的另一篇文章:ASP.NET R

.Net到Java學習——Spring Boot &&Profile &&Swagger2

剛學java不久,我有個疑問,為何用到的各種java開源jar包許多都是阿里巴巴的開源專案,為何幾乎很少見百度和騰訊?不是說好的BAT嗎? Spring Boot 的配置檔案及多環境配置   Spring Boot 使用一個全域性的配置檔案 application.properties 或 appli

spring boot實戰()Spring boot Bean載入原始碼分析

public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostPro

29. Spring boot 檔案(多檔案)【零開始學Spring Boot

【視訊&交流平臺】 http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=40000000

Spring boot 檔案(多檔案)【零開始學Spring Boot

檔案上傳主要分以下幾個步驟: (1)新建maven java project; (2)在pom.xml加入相應依賴; (3)新建一個表單頁面(這裡使用thymeleaf); (4)編寫controller; (5)測試; (6)對上傳的檔案做一些限制; (7)多檔案上傳

Spring Boot檔案

spring boot 2.0.5 要實現檔案上傳並直接訪問(檢視/下載) 配置靜態檔案路徑 application.properties uploadPath=/opt/data1/uploads/ ## 上傳路徑設定為靜態資源路徑,可以通過http直接訪問,

Spring Boot -- 檔案

Spring Boot -- 檔案上傳 一:檔案上傳 1. pom.xml 2. application.properties 3. Controller 4.測試 二:熱部署 spring-boot

spring boot 檔案配置檔案

spring:   thymeleaf.cache : false   messages.basename : static/message/messages   http:      multipart:     &n

一章:檔案&下載

作者:java_wxid 檔案的上傳介紹 檔案的上傳和下載功能是很多系統中非常常見的功能。非常的重要。 檔案的上傳 1、首先需要一個form表單 2、然後在表單內有input type=”file” 3、提交的方式必須是method=”POST” 4、enctype="multi

spring boot 檔案 最基礎的

首先:在控制層 controller 建 FileUploadController 程式碼: package com.example.springdemo.controller; import org.springframework.stereotype.Contro

Spring boot 檔案commons-fileupload

錯誤返回: Required request part 'file' is not present 請檢查你是否引入了這個jar包 自帶了upload files的配置 1.如果沒有 上傳檔案時需要引入並在webMvc配置 <!-- fileup