使用el-upload上传单文件多文件前后端实现

6 篇文章 0 订阅

需求:不自动上传文件并保存本地

1.单文件

上传单文件时可以使用action上传路径,调用自带的submit方法实现

前端代码:

<el-form-item prop="file">
<el-upload :limit="1" 
           :auto-upload="false" 
           :file-list="form.bannerUrl"
           :action="uploadUrl" ref="upload"
           list-type="picture-card"
           :on-change="fileChange"
           :on-remove="handleRemove">
           <i class="el-icon-plus"></i>
           <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>
</el-form-item>
export default {
        name: "AddBanner",
        data(){
            return{
            uploadUrl:"[后端上传路径]",
            file:null
         }
       },
       methods:{
            handleRemove(file, fileList) {
                //是否有上传文件的表单验证可忽略
                if (fileList.length === 0) {
                    this.file = null
                    this.$refs.form.validateField('file')
                }
            },
            fileChange(uploadFile, fileList) {
                this.file = uploadFile;
                //是否有上传文件的表单验证可忽略
                if (fileList.length !== 0) {
                    this.$refs.form.validateField('file')
                }
            },
      }
}

在实现提交的方法里加上 this.$refs.upload.submit();(upload对应el-upload中ref="upload")

后端代码:

controller:

@Autowired
private IExhibitService iExhibitService;

@PostMapping("/upload")
public JsonResult upload(@RequestParam("file") MultipartFile picFile) throws IOException{
        String data=iUploadService.fileUpload(picFile,"banners");
        return JsonResult.ok(data);
}

注:@RequestParam("file")一定要加,前端默认传过来的文件名为file,没有会报错;

使用MultipartFile接受前端传来的文件,关于MultipartFile

JsonResult 为自定义的给前端的返回结果类,如没有就替换为void,返回值依据自身情况而定。

Service:

public interface IUploadService {

    String fileUpload(MultipartFile picFile,String folderName) throws IOException;

    void fileRemove(String fileUrl);

}
@Service
public class UploadFileService implements IUploadService {

    private String dirPath = "D:/ProgramData";
    @Override
    public String fileUpload(MultipartFile picFile,String folderName) throws IOException{
        String fileName = picFile.getOriginalFilename();
        String suffix = fileName.substring(fileName.lastIndexOf("."));
        fileName = UUID.randomUUID()+suffix;
        File dirFile = new File(dirPath);
        if (!dirFile.exists()){
            dirFile.mkdirs();
        }
        String filePath = dirPath + "/"+folderName + "/"+ fileName;
        File dirFile2=new File(filePath);
        if (!dirFile2.exists()){
            dirFile2.mkdirs();
        }
        picFile.transferTo(dirFile2);
        return "/"+folderName + "/"+ fileName;
    }

    @Override
    public void fileRemove(String fileUrl) {
        String filePath = dirPath+fileUrl;
        new File(filePath).delete();
    }

}

2.多文件

不使用action的上传路径,需要一次上传多个文件,即一个文件数组;

前端代码:

<el-form-item class="f-start" prop="file" label="上传商品图片:">
   <el-upload :auto-upload="false" 
              :file-list="form.exhibitImgs"
              action="" ref="upload"
              list-type="picture-card"
              :on-change="fileChange"                  
              :on-remove="handleRemove">
     <i class="el-icon-plus"></i>
     <div slot="tip" class="el-upload__tip">多个或单个,只能上传jpg/png文件,且不超过500kb 
     </div>
   </el-upload>
</el-form-item>
export default {
        name: "AddBanner",
        data(){
            return{
            uploadUrl:"[后端上传路径]",
            file:null,
            exhibitImgs:[]
         }
       },
       methods:{
            handleRemove(file, fileList) {
                //是否有上传文件的表单验证可忽略
                if (fileList.length === 0) {
                    this.file = null
                    this.$refs.form.validateField('file')
                }
            },
            fileChange(uploadFile, fileList) {
                 this.file = uploadFile;
                this.exhibitImgs=fileList;
                if (fileList.length !== 0) {
                    this.$refs.form.validateField('file')
                }
            },
      }
}
           submitImg(){

                if (this.exhibitImgs.length===0){
                    return this.$message.warning('请选取文件后再上传');
                }
                let formData=new FormData();
                let count =this.exhibitImgs.length;
                for (let i=0;i<count;i++){
                    formData.append("files",this.exhibitImgs[i].raw)
                }
                let url="上传路径"
                this.axios.post(url,formData).then((response)=>{
                    //xxxx自定义
                })
            },

注:前端传数组需要以formData的形式传,append方法会在一个值对后面再加一个值,组成一个数组;

formdata.append("apple",1);
formdata.append("apple",2);
formdata.append("apple",3);
//最终apple:[1,2,3]

注:console.log(formdata)不是添加的一组组键值对数据,需要console.log (formdata.getAll ("apple"))才能输出apple数组,且获取整个数组要用getAll,用get方法只能输出数组第一个元素

后端代码:

思路和单文件一致,但需注意:

public void uploadExhibitImg(@RequestParam("files")MultipartFile[] picFiles)

这里接受参数为MultipartFile数组,@RequestParam("files")变量名为前端传递的formData的键名

至此上传文件基本完工。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端代码: 1. 首先在页面上引入el-upload组件: ```html <el-upload class="upload-demo" :action="url" //上传地址 :headers="headers" //请求头部 :on-success="handleSuccess" //上传成功回调函数 :on-error="handleError" //上传失败回调函数 :before-upload="beforeUpload" //上传前回调函数 :file-list="fileList" //文件列表 :limit="1" //上传文件个数限制 :accept=".xls,.xlsx" //文件类型限制 > <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <el-button size="small" type="success" @click="submitUpload">上传到服务器</el-button> <div slot="tip" class="el-upload__tip">只能上传excel文件</div> </el-upload> ``` 2. 在Vue组件中定义相关方法和数据: ```javascript data() { return { url: '/upload', //上传地址 headers: {}, //请求头部 fileList: [], //文件列表 } }, methods: { //上传成功回调函数 handleSuccess(response, file, fileList) { //处理上传成功的结果 console.log(response) }, //上传失败回调函数 handleError(error, file, fileList) { //处理上传失败的结果 console.log(error) }, //上传前回调函数 beforeUpload(file) { //处理上传前的操作 console.log(file) }, //上传到服务器 submitUpload() { this.$refs.upload.submit() }, } ``` 后端代码: 1. 在Spring Boot使用@RequestParam注解来接收上传的文件: ```java @PostMapping("upload") public String upload(@RequestParam("file") MultipartFile file) { //处理上传的文件 //... return "success"; } ``` 2. 在Spring MVC中使用@RequestPart注解来接收上传的文件: ```java @PostMapping("upload") public String upload(@RequestPart("file") MultipartFile file) { //处理上传的文件 //... return "success"; } ``` 注意:在处理上传的文件时,需要根据实际情况进行相应的处理,如解析Excel文件内容等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值