前端部分:
<template>
<div>
<el-row>
<el-col :span="12" :offset="6">
<div id="demo">
<el-row>
<el-col :span="24">
<div>
<el-upload
action=""
list-type="picture-card"
:auto-upload="false"
:limit="5"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove"
:on-change="fileChange"
:multiple="true"
:file-list="fileList">
<i class="el-icon-plus"></i>
</el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%" :src="dialogImageUrl" alt="">
</el-dialog>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="3" :offset="15">
<el-button type="primary" class="btn_pos" @click="uploadImage">上傳</el-button>
</el-col>
</el-row>
</div>
</el-col>
</el-row>
</div>
</template>
<script>
import axios from 'axios'
export default {
data () {
return {
dialogImageUrl: '',
dialogVisible: false,
//用來接收緩存中的圖片
fileList: []
};
},
methods: {
handleRemove(file, fileList) {
this.fileList = fileList;
},
fileChange(file, fileList){
this.fileList = fileList;
},
handlePictureCardPreview(file) {
this.dialogImageUrl = file.url;
this.dialogVisible = true;
},
uploadImage(){
let formData = new FormData();
for(let i = 0; i < this.fileList.length; i++){
//this.fileList[i].raw:獲取圖片格式
//這里的file必須和后端Controller中的requestparam參數一致,才能上傳成功,否則會報400錯誤
formData.append("file", this.fileList[i].raw, this.fileList[i].name);
}
//這里重新創建了一個axios實例,是因為我在全局配置里的Content-type是appliacation/json,而這里我想要使用multipart/form-data
const http1 = axios.create({
headers: {
// 'Content-Type': 'multipart/form-data'
"Content-Type": "multipart/form-data"
}
})
http1({
url: 'http://localhost:8081/lunbo/upload',
method: 'post',
data: formData
})
.then((res) => {
console.log(res.data);
})
.catch((err) => {
console.log(err);
});
}
}
}
</script>
<style scoped>
.btn_pos{
margin-top: 0px;
}
</style>
后端部分:
pom文件:
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.27.2</version>
</dependency>
controller部分:
@RestController @RequestMapping("/lunbo") public class LunboController { @Autowired private UploadUtill uploadUtill; /** * 圖片(文件上傳),並返回圖片地址 */ @RequestMapping("/upload") @ResponseBody //返回界面一個map<"path","...."> public Map<String,Object> uploadImage(@RequestParam("file") MultipartFile file){ //判斷文件是否為空(防止出現空指針異常) if(file.isEmpty()){ System.out.println("文件不存在"); }else{ System.out.println(file.getOriginalFilename()); } //創建一個HashMap對象 Map<String, Object> upload =new HashMap<>(); //返回的fastdfs的路徑 String path = uploadUtill.uploadImage(file); upload.put("path",path); return upload; } }
配置文件部分:
# FastDFS fdfs: so-timeout: 1501 connect-timeout: 601 thumb-image: # 縮略圖 width: 60 height: 60 tracker-list: ip:22122 upload: base-url: http://ip:8888/ allow-types: - image/jpeg - image/jpg - image/png - image/bmp - image/gif
配置類部分:
//@Component @ConfigurationProperties(prefix = "upload") public class UploadProperties { // @Value("${baseUrlt}") private String baseUrl; private List<String> allowTypes; public String getBaseUrl() { return baseUrl; } public void setBaseUrl(String baseUrl) { this.baseUrl = baseUrl; } public List<String> getAllowTypes() { return allowTypes; } public void setAllowTypes(List<String> allowTypes) { this.allowTypes = allowTypes; }
工具類部分:(因為要經常使用所以把它抽取出來做工具類)
思路:圖片上傳到fastdfs,然后獲取路徑,在拼接基本的路徑(在application.yml中配置的)
@Component @EnableConfigurationProperties(UploadProperties.class) public class UploadUtill { // Log log= LogFactory.getLog(UploadUtill.class); Log log= LogFactory.getLog(UploadProperties.class); @Autowired FastFileStorageClient storageClient; @Autowired UploadProperties prop; @Autowired LunboDao lunboDao; public String uploadImage(MultipartFile file) { // 1、校驗文件類型 String contentType = file.getContentType(); if (!prop.getAllowTypes().contains(contentType)) { throw new RuntimeException("文件類型不支持"); } // 2、校驗文件內容 try { BufferedImage image = ImageIO.read(file.getInputStream()); if (image == null || image.getWidth() == 0 || image.getHeight() == 0) { throw new RuntimeException("上傳文件有問題"); } } catch (IOException e) { log.error("校驗文件內容失敗....{}", e); throw new RuntimeException("校驗文件內容失敗"+e.getMessage()); } try { // 3、上傳到FastDFS // 3.1、獲取擴展名 String extension = StringUtils.substringAfterLast(file.getOriginalFilename(), "."); // 3.2、上傳 StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), extension, null); // 返回路徑 String path = prop.getBaseUrl() + storePath.getFullPath(); //存入數據庫 LunboEntity lunboEntity = new LunboEntity(); lunboEntity.setImgUrl(path); lunboEntity.setId(3); lunboDao.insert(lunboEntity); return path; } catch (IOException e) { log.error("【文件上傳】上傳文件失敗!....{}", e); throw new RuntimeException("【文件上傳】上傳文件失敗!"+e.getMessage()); } } }
注意:
如果業務中不需要點擊按鈕,這時候可以使用 :http-request="uploadImage" 來直接觸發該方法
