vue+element-ui,用el-upload实现阿里云Oss文件上传和下载

 <el-upload
        class="avatar-uploader"
        :class="!isEdit ? 'read-file' : 'editFile'"
        action
        :http-request="aliaCustomReq"
        :on-success="uploadSuccess"
        :on-preview="AliPreview"
        :on-remove="handleRemove"
        :on-error="uploadError"
        multiple
        :limit="limitNumber"
        :on-exceed="handleExceed"
        :file-list="fileList"
        :before-upload="beforeAvatarUpload"
      ></el-upload>

1:利用http-request自定义上传去覆盖默认上传事件。

2:由于上传的格式是FormData格式,首先需要在请求拦截的地方配置,改掉请求头部分。需要后台配置,不然显示跨域。

axios.interceptors.request.use(
  config => {
// 在这里加if语句判断,配置Content-Type 和 Access-Control-Allow-Origin
    if (
      config.headers &&
      config.headers["Content-Type"] === "multipart/form-data"
    ) {
      config.headers = {
        "Content-Type": "multipart/form-data",
        Authorization: token,
        device: "wap",
        Language: "zh-CN",
        "Access-Control-Allow-Origin": "*"
      };
    } else {
      if (typeof config.data !== "string") {
        config.data = JSON.stringify(config.data);
      }
      config.headers = {
        "Content-Type": "application/json",
        Authorization: token,
        device: "wap",
        Language: "zh-CN"
      };
    }
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

3:覆盖默认上传事件后,首先获取阿里的签名认证,再往接口里上传文件

aliaCustomReq(e) {
//这里获取阿里的签名认证
      this.$get("ailiUrl").then(res => {
        const serve = res;
// 传给后端的文件格式类型
        const formData = new FormData();
        let now = new Date().getTime();
//这一步是给fileList赋值,在做这个需求的时候,onchange拿到的参数不全,不建议用,建议在这里去赋值操作
        let newFile = {};
        for (let item in e.file) {
          newFile[item] = e.file[item];
        }
        formData.append("key", serve.dir + now + "_" + e.file.name);
        formData.append("OSSAccessKeyId", serve.accessid);
        formData.append("policy", serve.policy);
        formData.append("Signature", serve.signature);
        formData.append("callback", serve.callback);
        formData.append("success_action_status", "200");
        formData.append("file", e.file);
//传递参数,改变请求头
        this.$post(serve.host, formData, {
          "Content-Type": "multipart/form-data"
        }).then(data => {
          if (data) {
            newFile.url = data["host"] + "/" + data["filename"];
            if (!this.fileList) {
              this.fileList = [];
            }
            this.fileList.push(newFile);
          }
        });
      });
    }

4.下载功能 npm install ali-oss --save-dev 下载官网的包

AliPreview(file) {
      this.$get("aliUrl").then(res => {
        // 引入ali-oss文件
        let OSS = require("ali-oss");
        //https://help.aliyun.com/document_detail/111371.html 阿里云官方文档
        let client = new OSS({
          region: res.region,
          accessKeyId: res.accessid,
          accessKeySecret: res.accessKey,
          bucket: res.bucket
        });

        let objName = file.url
          .replace(res.host + "/", "")
          .replace(res.customName + "/", "");
        if (objName.includes("?")) {
          objName = objName.substring(0, objName.indexOf("?"));
        }
        let url = client.signatureUrl(objName, {
          response: {
            "content-disposition": `attachment; filename=${file.name}`
          }
        });
        url = url.replace(res.host, res.customName);
        console.log(url, "下载地址");
//此处为手机预览 pc预览用window.open
        window.location.href = url;
      });
    }

5.限制上传文件格式的话可在before-upload钩子函数里操作,

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,以下是实现 Vue+Element-UI上传图片并压缩的基本步骤: 1. 安装依赖 在项目中安装 Element-UI 和插件 vue-image-crop-upload 以及图片压缩库,可使用以下命令: ``` npm install element-ui vue-image-crop-upload compressjs --save ``` 2. 引入 Element-UI 在 main.js 中引入 Element-UI: ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI) ``` 3. 使用 vue-image-crop-upload 在需要上传图片的组件中使用 vue-image-crop-upload,可使用以下代码: ```vue <template> <div> <vue-image-crop-upload ref="upload" :url="uploadUrl" :headers="uploadHeaders" :size="size" :accept="accept" :beforeUpload="beforeUpload" :cropConfig="cropConfig" :compressConfig="compressConfig" @input="handleInput" @crop-success="handleCropSuccess" > <el-button size="small" type="primary">上传图片</el-button> </vue-image-crop-upload> </div> </template> <script> import VueImageCropUpload from 'vue-image-crop-upload' export default { components: { VueImageCropUpload }, data() { return { uploadUrl: 'xxx', // 上传地址 uploadHeaders: { // 上传请求头 Authorization: 'Bearer ' + getToken() }, size: 1024 * 1024 * 2, // 上传图片大小限制 accept: '.jpg,.jpeg,.png', // 上传图片格式限制 cropConfig: { // 图片裁剪配置 aspectRatio: 1 / 1, autoCropArea: 1, viewMode: 1, zoomable: false, guides: false, dragMode: 'move', cropBoxResizable: false, crop: () => {} }, compressConfig: { // 图片压缩配置 targetSize: 1024 * 1024, // 目标大小 quality: 0.7, // 压缩质量 mimeType: 'image/jpeg' // 输出格式 } } }, methods: { beforeUpload(file) { // 文件上传前的回调函数 this.$refs.upload.startUpload() }, handleInput(file) { // 文件选择后的回调函数 this.$refs.upload.showCrop() }, handleCropSuccess(blob, file) { // 图片裁剪成功后的回调函数 this.compressImage(blob, file) // 压缩图片 }, compressImage(blob, file) { // 图片压缩 const reader = new FileReader() reader.readAsDataURL(blob) reader.onload = (e) => { const base64 = e.target.result const compressedBlob = Compress.compress(base64, this.compressConfig) const compressedFile = new File([compressedBlob], file.name, { type: compressedBlob.type }) this.$emit('upload', compressedFile) // 触发上传事件 } } } } </script> ``` 4. 完成上传 在父组件中监听上传事件,使用 axios 或其他方法上传文件至服务器: ```vue <template> <div> <upload :action="uploadUrl" @upload="handleUpload"></upload> </div> </template> <script> import axios from 'axios' import Upload from './Upload.vue' export default { components: { Upload }, data() { return { uploadUrl: 'xxx' // 上传地址 } }, methods: { handleUpload(file) { const formData = new FormData() formData.append('file', file) axios.post(this.uploadUrl, formData).then(response => { console.log(response.data) }) } } } </script> ``` 以上就是实现 Vue+Element-UI上传图片并压缩的基本步骤,您可以根据您的具体需求进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值