文件上傳是在web開發(fā)中所遇到的比較常見的需求了狠持,常見的文件上傳有幾種
- 一是將文件上傳到oss等類似的文件服務(wù)器上,然后在數(shù)據(jù)庫中保存相應(yīng)的文件地址瞻润,上傳有對(duì)應(yīng)的sdk喘垂,地址直接就是一個(gè)http地址,這種方式下的文件上傳及顯示比較簡(jiǎn)單绍撞,但是成本較大正勒。
- 另一種就是將文件上傳到項(xiàng)目路徑的靜態(tài)資源文件夾resources/下,這種方式比較方便傻铣,也比較省成本章贞。在Springboot還未流行的時(shí)候,我們一般是用tomcat來運(yùn)行一個(gè)web項(xiàng)目非洲,這時(shí)候?qū)⑽募蟼鞯劫Y源文件夾下沒什么問題鸭限。但是springboot推薦使用jar包的方式來運(yùn)行(如果是在idea中直接運(yùn)行,非jar包两踏,則沒有半點(diǎn)問題)败京,這時(shí)候再將文件上傳到resources文件夾下就會(huì)有問題,會(huì)提示文件路徑不存在缆瓣。因?yàn)閞esource的文件操作是依賴于文件系統(tǒng)的喧枷,將項(xiàng)目打成一個(gè)獨(dú)立jar包后是沒有resource這個(gè)文件夾的虹统,解壓jar包就知道了弓坞。那么這時(shí)候我想要上傳文件到服務(wù)器上怎么辦呢隧甚,Springboot提供了一個(gè)靜態(tài)資源的映射方式,你可以添加一個(gè)外部文件夾并將其作為一個(gè)靜態(tài)資源文件夾的映射渡冻,也就是說添加這個(gè)映射后你可以在項(xiàng)目中像訪問靜態(tài)資源文件夾一樣來訪問外部的文件夾戚扳。具體怎么做呢,添加一個(gè)類就夠了族吻,上代碼帽借。
@Configuration
public class WebAppConfig implements WebMvcConfigurer {
@Value("${my.upload.imgPath}")
private String path;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
String staticMapping="/image/**";
String localDirectory = "file:"+path;
registry.addResourceHandler(staticMapping).addResourceLocations(localDirectory);
WebMvcConfigurer.super.addResourceHandlers(registry);
}
}
就這么幾行代碼,其中l(wèi)ocalDirectory變量是外部文件夾超歌,文件需要上傳到該文件夾中去砍艾,staticMapping就是映射的靜態(tài)資源請(qǐng)求路徑了。
比如說
localDirectory="/usr/file/image";(如果是windows下就"D://file/image")
staticMapping="/image/**"
文件上傳到localDirectory中后直接通過http://localhost:8080/image/xx.png即可拿到文件巍举。
下面把controller也一起貼出來吧
@Controller
@RequestMapping(value = "index")
public class IndexController {
@Value("${my.upload.imgPath}")
private String imgPath;
@RequestMapping(value = "/upload",method = RequestMethod.POST)
@ResponseBody
public String upload(HttpServletRequest request){
//上傳文件時(shí)可能會(huì)帶普通的參數(shù)脆荷,這樣可以直接拿到
String name = request.getParameter("name");
//可能會(huì)有多個(gè)文件同時(shí)上傳
List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
BufferedOutputStream stream = null;
for (MultipartFile f : files) {
if (f.isEmpty()){
continue;
}
try {
byte[] b = f.getBytes();
String fileName = f.getOriginalFilename();
// String path = "src/main/resources/uploadFile/";
// String path = imgPath+fileName;
String path = "/Users/halo/Documents/HtmlProject/"+fileName;
stream = new BufferedOutputStream(new FileOutputStream(new File(path)));
stream.write(b);
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return "success";
}
@RequestMapping("hello")
public String indexController(Model model){
model.addAttribute("imgsrc", "/image/34.jpg");
return "index";
}
}