掃盲
首先,必須明確幾個問題:
- 如果是ajax進行表單提交或者數(shù)據(jù)請求,就不要考慮文件上傳的問題了答朋。ajax做的是數(shù)據(jù)提交,壓根就不能進行文件的輸出棠笑。
- 文件上傳梦碗,必須注意一下請求類型,需要是文件請求并且必須是POST形式蓖救。參照:
<form id="baseForm" action="/admin/saveOrUpdatePageInfo" class="form-horizontal" role="form"
enctype="multipart/form-data" method="post">
注意:兩個屬性enctype和method洪规,其中method記得一定指定一下post。
實現(xiàn)過程
后臺業(yè)務實現(xiàn)
@RequestMapping("saveOrUpdatePageInfo")
public String saveOrUpdatePageInfo(ModelMap model,@RequestParam("file") MultipartFile file, PageInfo pageInfo,HttpServletRequest request){
//首先進行文件上傳
String contentType = file.getContentType();
String fileName = file.getOriginalFilename();
/*System.out.println("fileName-->" + fileName);
System.out.println("getContentType-->" + contentType);*/
// String filePath = request.getSession().getServletContext().getRealPath("imgupload/");
// String filePath = location+"/"+fileName;
try {
FileUtil.uploadFile(file.getBytes(), location, fileName);
} catch (Exception e) {
// TODO: handle exception
return "1";
}
pageInfo.setUrl(fileName);
//查詢業(yè)務編號是否存在
PageInfo samePageInfo = pageInfoService.selectByName(pageInfo.getName());
if(samePageInfo!=null){
return "1";
}else{
pageInfoService.saveOrUpdate(pageInfo);
}
return toPageSetting(model,request);
}
以上需要注意文件元素的傳入:使用RequestParam注解進行該元素的傳入操作@RequestParam("file") MultipartFile file循捺,其中file表示html頁面中文件對應的name標簽值斩例。
文件上傳
/**
* 上傳文件
* @param file 文件對應的byte數(shù)組流 使用file.getBytes()方法可以獲取
* @param filePath 上傳文件路徑,不包含文件名
* @param fileName 上傳文件名
* @throws Exception
*/
public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception {
File targetFile = new File(filePath);
if(!targetFile.exists()){
targetFile.mkdirs();
}
FileOutputStream out = new FileOutputStream(filePath+"/"+fileName);
out.write(file);
out.flush();
out.close();
}
頁面設計
<form id="baseForm" action="/admin/saveOrUpdatePageInfo" class="form-horizontal" role="form"
enctype="multipart/form-data" method="post">
<div class="form-group">
<label class="col-md-2 control-label">資源名稱</label>
<div class="col-md-10">
<input type="text" class="form-control" name="name">
</div>
</div>
</form>
上傳文件路徑
以上實現(xiàn)了文件的上傳過程从橘,但是我們使用springboot進行開發(fā)過程中念赶,最終打包生成的是一個jar包。那么問題來了恰力,文件上傳到了什么地方呢叉谜?大家知道,jar包啟動的時候踩萎,會默認生成一個tomcat運行文件夾正罢。上傳到該文件夾下面明顯是不合適的,因為每次運行jar包都會新生成一遍。那么翻具,之前上傳的文件都不存在了履怯,明顯不是我們期望的結果。
如何去指定一個文件夾作為默認的文件上傳路徑呢裆泳?
配置文件配置如下:
img.location = d:/mypicture
spring.mvc.static-path-pattern=/**
spring.resources.static-locations=file:${img.location}
我們使用@Value標簽獲取到文件上傳路徑叹洲。之后將路徑傳入到上傳文件的方法里面。
@Value("${img.location}")
private String location;
FileUtil.uploadFile(file.getBytes(), location, fileName);
以上工禾,完成了一個指定文件路徑上傳的功能运提。
靜態(tài)資源訪問
上傳文件完成之后,就可以進行圖片的訪問了闻葵。但是民泵,對于springboot而言,已經(jīng)對請求進行了攔截槽畔。并且栈妆,假如是絕對路徑的話,該圖片是存在于服務端的厢钧,服務端下的某個絕對地址鳞尔,如何從客戶端進行訪問?
配置文件配置如下:
img.location = d:/mypicture
spring.mvc.static-path-pattern=/**
spring.resources.static-locations=file:${img.location}
什么意思呢早直?我們指定了一個靜態(tài)資源寥假,并且指定所有的請求都會經(jīng)過該靜態(tài)資源的過濾。假如此時我請求一個資源霞扬,比如localhost:8080/test.jpg糕韧。我們就會對該路徑進行攔截,攔截之后做什么呢喻圃?會去spring.resources.static-locations對應的路徑下面查找該資源萤彩。當然,如果配置多個的話级及,會進行路徑的逐個查詢乒疏。此時,會從d:/mypicture下滿查找test.jpg饮焦。找到之后怕吴,就進行了資源的顯示。
以上县踢,即為簡單的基于springboot的文件上傳說明转绷。