前端部分:
<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: # 缩略图 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" 来直接触发该方法