vue里边的elementui的文件上传是怎么使用的?里面的参数是什么意思?

本文详细介绍了如何在SpringBoot中配置文件上传,利用Nginx作为持久化存储,并通过Postman进行测试验证。同时,讲解了Vue前端使用ElementUI的el-upload组件进行文件上传的配置和相关属性含义,包括action属性的代理设置。

我们先不讨论ElementUI的 el-upload 标签是怎么使用的,先研究一下后端的代码是怎么写的

在本机安装一个nginx,并且知道它的部署目录是什么,我的系统macOS,nginx的访问根目录就是 /usr/local/var/www ,如果是windows,那么根目录就是 nginx安装目录下的html目录下(听度娘说的)

这个nginx是用来永久保存上传的文件的,因为idea内置tomcat重新启动的时候,就会把这些已经上传的图片给清理掉,所以要复制一份到nginx

 

新建一个springboot的工程,建立一个controller类,名叫FileUploadController吧

其中,copy方法里边,有4个参数

copy(String source, String dest,String fileName, int bufferSize)

source参数要传入本地文件的绝对路劲,先上传到idea内置tomcat,会生成一个图片的绝对路劲,代入进去就行了,这个路劲当然是要包含图片文件名的

dest参数要传入复制的目标路劲,目标路劲最后面就不需要带文件名了,只是一个目录

fileName就是文件名了,不多说

bufferSize byte数组大小,填个适当的数字就行

package com.xeon.orderconsumer.controller;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@RestController
@RequestMapping("/imgupload")
public class FileUploadController {
    String nginxServer = "http://127.0.0.1:8080";

    SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd");
    @PostMapping("uploadHousekeeperImage")
    public Map<String,Object> fileupload(MultipartFile file, HttpServletRequest request) {
            Map<String,Object> result = new HashMap<>();
            String originName = file.getOriginalFilename();
            if(!(originName.endsWith(".jpg")||originName.endsWith(".jpeg")||originName.endsWith(".png"))){
                result.put("status","error");
                result.put("msg","文件类型找不到");
                return result;
            }
            String format = sdf.format(new Date());
            String realPath = request.getServletContext().getRealPath("/")+format;
            System.out.println("realPath:::"+realPath);
            File folder = new File(realPath);
            System.out.println("folder:::"+folder);
            if(!folder.exists()){
                folder.mkdirs();
            }
            String newName = UUID.randomUUID().toString().substring(0,16)+".jpg";
            try{
                file.transferTo(new File(folder,newName));
                String url = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+format+"/"+newName;
                copy(realPath+"/"+newName,"/usr/local/var/www"+format,newName,64);
//                String url = request.getScheme()+"://"+"127.0.0.1"+":"+"8080"+format+newName;
                result.put("status","success");
                result.put("url",nginxServer+"/"+format+"/"+newName);
                result.put("localUrl",url);
            }catch (Exception e){
                result.put("status","error");
                result.put("msg",e.getMessage());
                return result;
            }

            return result;

    }

    public static void copy(String source, String dest,String fileName, int bufferSize) {
        System.out.println(source);
        System.out.println(dest);
        System.out.println(fileName);
        InputStream in = null;
        OutputStream out = null;
        try {
            in = new FileInputStream(new File(source));
            File newPath = new File(dest);
            if(!newPath.exists()){
                newPath.mkdirs();
            }
            out = new FileOutputStream(new File(dest+"/"+fileName));

            byte[] buffer = new byte[bufferSize];
            int len;

            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

使用postman测试一下请求,看能不能上传文件

确实是可以的,已经上传到了,nginx的目录下

postman返回了这些数据,我们用url属性的值复制过来访问一下浏览器,应该是没问题的,浏览器会显示一张图片

 

vue前端的ElementUI的el-upload怎么使用?标签的属性含义是什么?

先上代码,往下解析这些属性是什么意思

el-upload 标签

<el-upload
                action="/image/imgupload/uploadHousekeeperImage"
                :on-preview="handlePreview"
                :on-success="successUpload"
                accept="*"
                :on-remove="onRemove"
                :limit="10">
                <el-button size="small" type="primary">点击上传</el-button>
                <div slot="tip" class="el-upload__tip">上传照片</div>
                <img :src="imageUrl" style="width: 100px;height: 100px" v-if="imageUrl!==''">
              </el-upload>

定义数据,图片的url,即访问地址

data(){
        return {
          imageUrl: ''
        }
      }

定义方法:

methods:{
        onRemove(file, fileList){
          this.imageUrl = ''
        },
        successUpload(response, file, fileList){
          this.imageUrl = file.response.url;
        },
        handlePreview(file) {
          window.open(file.response.url);
          console.log(file.response.url);
        }
}

 

el-upload标签常用属性是什么意思?

这个action属性就是官方文档没有说清楚的地方,这里我们把它说清清楚了

① action="/image/imgupload/uploadHousekeeperImage"

我们先打开config目录下的index.js文件,看看代理表

action等于这个/image/imgupload/uploadHousekeeperImage,就相当于发送一个这样的请求:"http://127.0.0.1:8883/imgupload/uploadHousekeeperImage" , 这个请求地址恰好跟postman发送的url是一样的

这个代理表的意思就是在vue里面发送的请求url以image开头的时候,就会请求 http://127.0.0.1:8883 的服务器,往后根据实际情况写请求路劲

②:on-preview="handlePreview" 表示点击文件列表的某一项项以后,触发haldlePreview函数

带了file参数,以获取文件的一些信息

③ :on-success="successUpload" 上传成功以后会调用的函数

在这里,直接获取文件的访问地址,赋值给imageUrl变量

其余的属性都见名知意了,ElementUI官网文档很详细

 

<think>好的,我现在需要解决用户的问题:如何在VueElementUI中实现手动触发文件上传功能。根据用户提供的引用内容,特别是引用[1],用户提到官方文档通常展示的是自动上传,而实际开发中可能需要手动上传,比如结合表单提交。用户需要具体的解决方案或代码示例。 首先,我要回顾ElementUI的上传组件。ElementUI的el-upload组件默认情况下,当用户选择文件后会自动上传到指定的URL。但用户希望手动控制上传时机,比如在选择文件后先进行一些处理,然后通过按钮触发上传。 根据引用[1]中的情况,用户可能需要手动上传,比如在表单提交时一起上传文件。这时候需要阻止自动上传,改为手动触发。查阅ElementUI的文档,el-upload组件有一个auto-upload属性,将其设置为false可以关闭自动上传。然后,需要通过ref来获取上传组件的方法,手动调用submit方法。 接下来,我需要考虑如何收集文件。用户选择文件后,文件会被添加到el-upload的fileList中。但根据引用[3],用户提到在on-change钩子中获取的file参数可能不是原始文件对象,而是包含raw属性的对象。因此,需要遍历fileList,提取每个文件的raw属性,这些才是真正的File对象,可以用于手动上传。 另外,用户可能需要在提交表单时,将文件数据与其他表单数据一起发送到后端。这时候,可能需要使用FormData对象来构造请求体,将文件和其他字段附加进去,然后通过axios或其他HTTP库发送请求。 还需要考虑上传成功后的处理,比如显示成功消息、更新文件列表,或者处理错误情况。根据引用[3],上传成功后可能需要回显图片,但这里用户的需求是手动上传,所以可能需要处理上传后的回调,比如清空文件列表或显示上传结果。 现在,我需要将这些步骤整合成一个清晰的示例代码。首先,在模板中使用el-upload组件,设置auto-upload为false,绑定on-change事件以更新文件列表。然后,添加一个按钮,点击时触发手动上传的方法。在方法中,通过ref获取上传组件的文件列表,提取raw文件,构造FormData,使用axios发送POST请求。同时,处理上传成功或失败的回调,给出用户反馈。 需要注意,上传的action属性可能需要设置为一个有效的后端接口URL,或者如果暂时没有,可以留空,然后在手动上传的方法中自定义请求。另外,文件类型的验证、大小限制等也可以通过before-upload钩子处理,但由于是手动上传,可能需要在提交时进行验证。 最后,测试示例代码的正确性,确保文件能被正确收集和上传,处理各种边界情况,比如没有选择文件时点击上传按钮的提示,上传过程中的加载状态等,以提升用户体验。</think>在VueElementUI中实现手动触发文件上传功能,可通过以下步骤实现: ### 一、解决方案核心要点 1. 禁用自动上传:设置`auto-upload=false` 2. 通过ref获取上传文件列表 3. 手动提交时使用FormData封装文件数据 4. 调用XMLHttpRequest或axios实现上传 ### 二、代码实现示例 ```html <template> <div> <!-- 手动上传组件 --> <el-upload ref="uploadRef" action="#" // 留空或填写实际接口地址 :auto-upload="false" :on-change="handleFileChange" :file-list="fileList"> <el-button type="primary">选择文件</el-button> </el-upload> <!-- 手动触发按钮 --> <el-button @click="submitUpload">立即上传</el-button> </div> </template> <script> export default { data() { return { fileList: [], rawFiles: [] // 存储原始文件对象[^3] } }, methods: { // 文件选择变化事件 handleFileChange(file, fileList) { this.fileList = fileList this.rawFiles = fileList.map(item => item.raw) // 提取原始文件[^3] }, // 手动上传触发 async submitUpload() { if (this.rawFiles.length === 0) { this.$message.warning('请先选择文件') return } const formData = new FormData() this.rawFiles.forEach(file => { formData.append('files[]', file) // 根据后端接口调整字段名 }) try { const response = await this.$axios.post('/api/upload', formData, { headers: {'Content-Type': 'multipart/form-data'} }) this.$message.success('上传成功') this.$refs.uploadRef.clearFiles() // 清空已选文件 } catch (error) { this.$message.error('上传失败') } } } } </script> ``` ### 三、关键实现说明 1. **禁用自动上传**:通过`auto-upload=false`关闭自动提交[^1] 2. **获取原始文件**:从on-change事件的file参数中提取raw属性获取真实File对象[^3] 3. **表单数据封装**:使用FormData处理多文件上传格式要求 4. **请求头设置**:必须设置`'Content-Type': 'multipart/form-data'`才能正常上传 5. **状态清理**:上传完成后调用clearFiles()方法重置组件状态 ### 四、扩展功能建议 1. **文件类型验证**:通过before-upload钩子添加格式校验 ```js :before-upload="(file) => { const isJPG = file.type === 'image/jpeg' if (!isJPG) this.$message.error('仅支持JPG格式') return isJPG }" ``` 2. **进度显示**:可通过axios的onUploadProgress回调实现进度条 3. **大文件分片**:超过2GB文件建议使用web-file-uploader等分片上传方案
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值