el-upload 上传、预览、和下载

最近碰到个需求是上传文件 点击预览 和 下载。恰好我没写过这方面的,让我纠结了好久啊 

 

1.上传(采用的是自定义上传 方式)

使用 :http-request 

 <el-upload
          ref="upload"
          :limit="1"
          action="string"
          :http-request="fileRequest"
          :before-remove="handleRemove"
          :on-exceed ="handleExceed"
        >
          <el-button slot="trigger" size="small" type="primary" >上传附件</el-button>
        </el-upload>
          <div v-for="(file ,index) in fileList" :key="index" class="file-list">
            <span>{{file.name}} </span> 
           <div>
            <el-button  type="text" size="small" @click="handlePreview(file)">预览</el-button>
            <el-button type="text" size="small" style="color: red;" @click="handleRemove(file)">删除</el-button>
           </div>
        </div>

因为下面的文件显示是自定义的我就把el-upload自带的隐藏了

::v-deep .el-upload-list{
  display: none;
}
.file-list{
  display: flex;
  justify-content: space-between;
  padding-right: 30px;
  margin-top: 10px;
}

文件上传的代码 接口返回的是一个文件路径 所以我就得自己切出来文件名

fileRequest(file){
      let formData = new FormData();
      formData.append("file", file.file); 
      uploadFileApi(formData).then(res=>{
        this.$message.success(res.msg);
        this.url = res.data.fileUrl;
        this.fileList.push({
          name:file.file.name,
          url:this.url
        })
      })
    },

2.预览 直接用的window.open()

    handlePreview(file) {
      try {
        window.open("http://"+file.url, '_blank')
      } catch (error) {
        this.$message.error('解析路径失败!');
      }
      
    },

3.下载

我在这块做了好久啊 主要是一直想的是直接有url了 可以直接下载 但是后来发现下载的文件显示错误

最后变成了请求 接口下载 后端返回文件流

文件流的长相~  就是这个死样子  然后 因为没返回code  !  拦截器直接拦截了 

最后的代码:

 handleUpload(file) {
      let fileName = file.fileName;//文件名
      let url = '/api/file/download?fileName='+fileName ;
      const x = new window.XMLHttpRequest();
      x.open("GET", url, true);
      x.responseType = "blob";
      x.setRequestHeader('token', getToken())
      x.onload = () => {
      const url = window.URL.createObjectURL(x.response);
      const a = document.createElement("a");
      a.href = url;
      a.target = "_blank";
      a.download = fileName;
      a.style.display = "none";
      document.body.append(a);
      a.click();
      };
      x.send();
    },
 记录一下昨天下午+晚上的成果 省的自己哪天用到的时候找不到~ 
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现文件上后的下载功能,你可以使用以下方法: 1. 文件下载:在服务器端,将上的文件保存到指定的位置,并为该文件生成一个唯一的下载链接。然后,在前端页面上提供一个下载按钮或链接,当用户点击时,使用该链接进行文件下载。 2. 文件:对于常见的文档类型(如PDF、Word、Excel等),可以使用相应的插件或库来实现文件功能。你可以在前端页面上添加一个按钮或链接,当用户点击时,通过插件或库加载并显示文件内容。 以下是一个示例代码,使用 Vue.js 和 Element UI 中的 el-upload 组件来实现文件上下载功能: ```html <template> <div> <el-upload class="upload-demo" action="/api/upload" :on-success="handleUploadSuccess" :file-list="fileList" > <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <el-button slot="tip" size="small" type="success">上到服务器</el-button> </el-upload> <el-button v-if="fileList.length > 0" size="small" type="primary" @click="downloadFile">下载文件</el-button> <el-button v-if="fileList.length > 0" size="small" type="info" @click="previewFile">文件</el-button> </div> </template> <script> export default { data() { return { fileList: [], downloadUrl: '' }; }, methods: { handleUploadSuccess(response, file, fileList) { // 上成功后,保存服务器返回的下载链接 this.downloadUrl = response.downloadUrl; this.fileList = fileList; }, downloadFile() { // 使用保存的下载链接进行文件下载 window.location.href = this.downloadUrl; }, previewFile() { // 在新标签页中打开文件链接 window.open(this.downloadUrl); } } }; </script> ``` 在上面的例子中,el-upload 组件通过 action 属性指定了文件上的接口地址。在服务器端的上接口中,你需要将文件保存到指定位置,并将下载链接返回给前端。前端通过 handleUploadSuccess 方法获取服务器返回的下载链接,并保存在 downloadUrl 变量中。当用户点击下载按钮时,调用 downloadFile 方法,使用保存的下载链接进行文件下载。当用户点击按钮时,调用 previewFile 方法,在新的标签页中打开文件链接。 请注意,上文件和保存到服务器的逻辑需要根据你的具体需求进行实现。此示例仅提供了一个基本的框架,你可以根据需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值