springboot上傳文件最簡單的操作

在開始之前我們先說下multipart的配置 直接在application.properties進行配置即可 我寫的很清楚了就不說了 這些都是默認值

#單個上傳文件最大
spring.servlet.multipart.max-file-size=1MB
#上傳文件總大小最大
spring.servlet.multipart.max-request-size=10MB
#(零界值)超過零界值就忘硬盤寫  不超過寫內存
spring.servlet.multipart.file-size-threshold=0
#文件很大的話  需要一個臨時文件夾保存文件  然後再寫入硬盤  這就是那個路徑設置
spring.servlet.multipart.location=

我們以上傳img爲例 我們使用@RestController註解哦

開始之前我們先複習幾個servletRequest 的方法

獲取web應用上下文 request.getServletContext()

獲取項目的絕對路徑 getRealPath(String)

一般來說不支持單獨使用getRealPath 我們會使用 request.getServletContext().getRealPath(String)獲取web應用的相對路徑的絕對路徑

我們給我們的文件進行分類 使用時間進行分類會更好一點

那麼我們創建一個現行時間

 SimpleDateFormat sdf=new SimpleDateFormat("/yyyy-MM-dd");

我們設置絕對路徑爲realPath 在這兒我們可以提一個知識點 這是se基礎知識

String lujing=d:\a\\b

使用file.mkdirs創建的話 沒有a不能創建b

使用file.mkdirs創建的話 沒有a我們也可以創建b 那麼a也會被創建

	   String format =  sdf.format(new Date());
        String realPath = request.getServletContext().getRealPath("/img") + format;
        //文件夾
        File folder = new File(realPath);
        //如果文件夾不存在那麼我們就創建一下
        if(!folder.exists()){
            folder.mkdirs();
        }

路徑弄完了 我們來設置文件名

我們爲了防止名稱重複使用uuid進行創建 那麼我們設置newName 下面代碼就是se中String的基礎知識了

       //獲取傳來的文件名字
       String originalFilename = file.getOriginalFilename();
        String newName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

下面我們存下文件 然後我們吧路徑返回


        try {
            //存文件
            file.transferTo(new File(folder,newName));
            String url=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/img"+format+newName;
            return url;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "error";

我們解析下下面代碼

request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/img"+format+newName;

request.getScheme() 獲取http協議 正常來說返回的是 http

request.getServerName() 獲取我們的訪問ip 本地項目一般是localhost

request.getServerPort() 獲取我們的端口號

最後呢我們可以在html中寫文件上傳控件

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>fileupload</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="提交">
</form>
</body>
</html>

基本上都是基礎 我們說一下enctype=“multipart/form-data”

這個的意思就是說表單數據有多部分構成,既有文本數據,又有文件等二進制數據的意思。

需要注意的是:默認情況下,enctype的值是application/x-www-form-urlencoded,不能用於文件上傳,只有使用了multipart/form-data,才能完整的傳遞文件數據。

application/x-www-form-urlencoded不是不能上傳文件,是隻能上傳文本格式的文件,multipart/form-data是將文件以二進制的形式上傳,這樣可以實現多種類型的文件上傳。

擴展資料(以下資料來源於網絡):

一、關於HTML 標籤的 enctype 屬性

application/x-www-form-urlencoded:在發送前編碼所有字符(默認)

multipart/form-data: 不對字符編碼,或在使用包含文件上傳控件的表單時,必須使用該值。

text/plain:空格轉換爲 “+” 加號,但不對特殊字符編碼。

二、enctype:規定了form表單在發送到服務器時候編碼方式,有如下的三個值。

1、application/x-www-form-urlencoded。默認的編碼方式。但是在用文本的傳輸和MP3等大型文件的時候,使用這種編碼就顯得 效率低下。

2、multipart/form-data 。 指定傳輸數據爲二進制類型,比如圖片、mp3、文件。

3、text/plain。純7a64e78988e69d8331333366306562文體的傳輸。空格轉換爲 “+” 加號,但不對特殊字符編碼。

下面放下我們全部的java代碼和html代碼

package com.file;

@RestController
public class FilruploadController {

    SimpleDateFormat sdf=new SimpleDateFormat("/yyyy-MM-dd/");
    @PostMapping("/upload")
    public String file(MultipartFile file, HttpServletRequest request){
        String format =  sdf.format(new Date());
        String realPath = request.getServletContext().getRealPath("/img") + format;
        //創建文件夾路徑
        File folder = new File(realPath);
        //如果文件夾已經不存在那麼我們就創建一下
        if(!folder.exists()){
            folder.mkdirs();
        }
        String originalFilename = file.getOriginalFilename();
        String newName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
        try {
            file.transferTo(new File(folder,newName));
            String url=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+"/img"+format+newName;
            return url;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "error";
    }

}

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>fileupload</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="提交">
</form>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章