首頁 > 軟體

Spring Boot簡單實現檔案上傳功能

2022-08-23 18:02:13

前言

  • 前端處理 通過form表單來上傳檔案
  • 提交方式為post
  • enctype格式為"multipart/form-data"
  • input型別為file
  • name屬性必須和Controller中方法的形參名稱一致
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h2>使用者註冊</h2>
    <form action="/register" method="post" enctype="multipart/form-data">
        使用者名稱:<input type="text" name="username"><br><br>
        密碼  :<input type="password" name="password"><br><br>
        頭像  :<input type="file" name="uploadFile"><br><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

後端處理

建立一個資料庫用來儲存登入的使用者名稱,密碼,檔名

我們可以寫一個工具類:

public class UUIDUtils {
    public static String createNewUUID(){
        String uuid = UUID.randomUUID().toString();
        //如果要把uuid的-去掉替換成空字串 然後需要把32為字串變成64字串
        uuid = uuid.replace("-", "");
        return uuid+uuid;
    }
}

實體類User:

@Data
public class User {
    private Integer id;
    private String username;
    private String password;
    private String filename;
}

Controller:

@Controller
public class UserController {
    @Autowired
    private UserService userService;

    /**
     * 顯示註冊畫面
     * @return
     */
    @RequestMapping("/show")
    public String show(){
        return "/page/register.html";
    }
    @PostMapping("/register")
    public String register(User user, @RequestParam("uploadFile") MultipartFile uploadFile){
        System.out.println("使用者:"+user);
        System.out.println("檔案:"+uploadFile);
        //建立本地檔案
        //思考檔名,檔名要是唯一的 必須要保證每一個使用者註冊上傳的圖片,檔案等,必須儲存成唯一的檔名
        //Java技術 Java UUID User Unique ID 本身用於給使用者指定唯一的ID,可以用它來產生唯一的隨機字串
        //uuid預設返回的是32位元字母組成的隨機字串,重複的概率幾乎為0
        //建立唯一檔名
        String fileName= UUIDUtils.createNewUUID();
        //我們需要檔案的字尾也應該不是寫死的,前端上傳的字尾是啥,我們儲存的就是什麼
        //獲取原生檔案的檔名
        String originalFilename = uploadFile.getOriginalFilename();
        System.out.println(originalFilename);
        //建立檔案的字尾名
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        //建立新的檔案路徑
        String filePath=fileName+suffix;

        File srcFile = new File("D:/springboot/download/img/"+filePath);
        try {
            //把前端傳送的檔案儲存在本地中
            uploadFile.transferTo(srcFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        user.setFilename(filePath);
        try {
            userService.register(user);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}

Service

public interface UserService {
    void register(User user) throws Exception;
}

Service實現類

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public void register(User user) throws Exception {
        userMapper.insert(user);
    }
}

Mapper

@Mapper
public interface UserMapper {
    @Insert("insert into user values(default,#{username},#{password},#{filename})")
    void insert(User user);
}

物理路徑和虛擬路徑對映

先準備好頁面jsp

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8">
        <title>Title</title>
      </head>
      <body>
        <h2>檔案的上傳</h2>
        <form action="/file/upload" method="post" enctype="multipart/form-data">
          檔案上傳:<input type="file" name="uploadFile">


          <input type="submit" value="提交">
        </form>
      </body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <img src="/img/${filePath}">影象</img>
    路徑:${filePath}
</body>
</html>

編寫Controller

@Controller
@RequestMapping("/file")
public class FileUploadController {
    /**
    * 顯示畫面
    * @return
    */
    @RequestMapping("/show")
    public String show(){
        return "file.jsp";
    }

    @RequestMapping(value = "/upload",method = RequestMethod.POST)
    public String fileUpload(MultipartFile uploadFile, HttpSession session){
        //利用uuid建立唯一的字串 讓這個字串作為檔名
        String fileName = UUIDUtils.createNewUUID();

        //獲取上傳檔案的檔名
        String originalFilename = uploadFile.getOriginalFilename();
        //獲取字尾名
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        //建立檔案儲存路徑
        String filePath=fileName+suffix;
        File srcFile=new File("D:/springboot/download/img/"+filePath);
        //把前端檔案儲存在本地
        try {
            uploadFile.transferTo(srcFile);
            //把檔案存放在原生的檔案路徑儲存在session域中
            session.setAttribute("filePath", filePath);

        } catch (IOException e) {
            e.printStackTrace();
        }
        //我們希望網頁上可以把圖片顯示出來
        System.out.println("檔案存放路徑:"+filePath);
        return "show.jsp";
    }
}

不過,我們可以發現,當我們點選提交的時候,圖片還是無法顯示:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    //實現資源的虛擬路徑和物理路徑的對映

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
         registry.addResourceHandler("/img/**")
                 .addResourceLocations("file:"+"D:\springboot\download\img\");
    }
}

addResourceHandler(“xxx”) 用於指定對外暴露的存取路徑,addResourceLocations(“xxx”) 用於指定檔案放置路徑

到此這篇關於Spring Boot簡單實現檔案上傳功能的文章就介紹到這了,更多相關Spring Boot檔案上傳內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com