首頁 > 軟體

SpringBoot上傳圖片到指定位置並返回URL的實現

2022-03-20 10:00:16

想做一個上傳圖片的功能,來展示使用者上傳的圖片。

在返回給前端的URL上弄了好久,前端一直無法存取到URL,結果一直顯示404。 倒騰了一上午發現是 檔案路徑對映的問題,後端部分有講解決辦法,可供大家參考

需求

前端的圖片上傳到伺服器指定的檔案目錄,並且將URL返回給前端

前端部分(ElementUI+Vue.js)

ElementUI的匯入和使用:(元件 | Element)

Vue.js的匯入和使用:(Vue.js (vuejs.org))

<template>
  <div class="form-group">
    <el-upload
        action="http://localhost:8081/upload"
        :on-preview="handlePreview"
        accept='.jpg'
        :limit="10"
    >
        <el-button size="small" type="primary">點選上傳</el-button>
        <div slot="tip" class="el-upload__tip">只能上傳jpg/png檔案,且不超過500kb</div>
    </el-upload>
  </div>
</template>

<script>

export default {
    name: "updateImg",
    methods:{
        handlePreview(file){
            window.open(file.response.url);
            console.log(file.response.url);
        }
    }
}
</script>

<style scoped>

</style>

效果:

後端部分(SpringBoot)

1.先設定application.yml檔案

file-save-path:要儲存圖片的位置 早上遇到404問題是因為 在 設定file-save-path時候 沒有在最後的 images後加上 ‘’ 導致路徑無法匹配到

server:
  port: 8081
  
file-save-path: D:SoftWareSpringToolSuiteWorkPlaceHelloWorldsrcmainresourcesstaticimages
spring:
  mvc:
    view:
      prefix: /
      suffix: .jsp

2.對映資源-重寫WebMvcConfigurer介面,實現對資源的對映

package com.etc.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer{
	
	@Value("${file-save-path}")
	private String fileSavePath;
	
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/images/**").addResourceLocations("file:"+fileSavePath);
		//System.out.println("file:"+fileSavePath);
	}

}

addResourceHandler("/images/**")表示凡事以 /images/ 路徑發起請求的,按照 addResourceLocations("file:"+fileSavePath)的路徑進行對映

例如有一個url:http://localhost:8081/images/Hello.jpg

表示要對Hello.jpg進行請求存取,這時候伺服器會把這個請求的資源對映到我們設定的路徑之下 也就是會到 fileSavePath 下去尋找 是否有 Hello.jpg 這個資源,返回給前端頁面。

3.Controller程式碼

這邊為了方便使用Map進行返回,實際開發中使用封裝好的型別進行返回

package com.etc.controller;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;
import javax.sound.midi.SysexMessage;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@CrossOrigin
@RestController
public class ImgUploadController {

	SimpleDateFormat sdf = new SimpleDateFormat("/yyyy.MM.dd/");
	
	@Value("${file-save-path}")
	private String fileSavePath;
	
	@PostMapping("/upload")
	public Map<String, Object> fileupload(MultipartFile file,HttpServletRequest req){
		
		Map<String,Object> result = new HashMap<>();
		//獲取檔案的名字
		String originName = file.getOriginalFilename();
		System.out.println("originName:"+originName);
		//判斷檔案型別
		if(!originName.endsWith(".jpg")) {
			result.put("status","error");
			result.put("msg", "檔案型別不對");
			return result;
		}
		//給上傳的檔案新建目錄
		String format = sdf.format(new Date());
		String realPath = fileSavePath + format;
		System.out.println("realPath:"+realPath);
		//若目錄不存在則建立目錄
		File folder = new File(realPath);
		if(! folder.exists()) {
			folder.mkdirs();
		}
		//給上傳檔案取新的名字,避免重名
		String newName = UUID.randomUUID().toString() + ".jpg";
		try {
			//生成檔案,folder為檔案目錄,newName為檔名
			file.transferTo(new File(folder,newName));
			//生成返回給前端的url
			String url = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() +"/images"+ format + newName;
			System.out.println("url:"+url);
			//返回URL
			result.put("status", "success");
			result.put("url", url);
 		}catch (IOException e) {
			// TODO Auto-generated catch block
 			result.put("status", "error");
 			result.put("msg",e.getMessage());
		}
		return result;
				
	}
}

到此這篇關於SpringBoot上傳圖片到指定位置並返回URL的實現的文章就介紹到這了,更多相關SpringBoot上傳圖片並返回URL內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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