前端直传阿里云OSS vue2 web端element-ui 组件upload

需求:前端上传文件不经过后端,大文件大视频等也可以快速上传

1.配置好阿里云OSS后获取相关key

最重要的参数:

AccessKey ID:  ************************
AccessKey Secret:  ************************
Bucket :************
fileHost: https://************.oss-cn-shenzhen.aliyuncs.com
fileHost中间一般为Bucket 拼接
1.安装 ali-oss  cmd  安装

npm i  --save ali-oss

2.创建文件

tools.js

let OSS = require('ali-oss')
 
let client = new OSS({
  region: 'oss-cn-shenzhen',    //创建的时候,bucket所在的区域
  accessKeyId: 'LTA***************',// 阿里云控制台创建的AccessKey
  accessKeySecret: '0L************', //阿里云控制台创建的AccessSecret
  bucket: '*********'  //创建的bucket的名称
})
 
export const put = async (ObjName, fileUrl) => {  
  try {    
    let result = await client.put(`${ObjName}`, fileUrl)    
    // ObjName为文件名字,可以只写名字,就直接储存在 bucket 的根路径,如需放在文件夹下面直接在文件名前面加上文件夹名称    
    return result  
  } catch (e) {    
   console.log(e)  
  }
}
 
// 上传成功之后,转换真实的地址
export const signatureUrl= async (ObjName) => {    
  try {        
    let result = await client.signatureUrl(`${ObjName}`)    
    return result  
  } catch (e) {    
    console.log(e)  
  }
}
 
export const getFileNameUUID = () => {  
  function rx() {    
    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)  
  }  
  return `${+new Date()}_${rx()}${rx()}`
}
<template>
  <div>
      <el-upload 
        drag 
        ref="upload"
        action="#"
        :on-preview="handlePreview"
        :on-remove="handleRemove"
        :before-upload="beforeAvatarUpload"
        :file-list="fileList"
        :http-request="handleUpload"
        multiple>
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        <div class="el-upload__tip" slot="tip">只能上传PDF  JPEG JPG PNG文件</div>
      </el-upload>
  </div>
</template>

<script>

    import { put, signatureUrl, getFileNameUUID } from '@/api/fileOss/tools'
    export default {
        data() {
            return {
                headers: {}, //请求token
                data: {}, //上传时候携带的参数
                token: '', //上传时候的token
                canUploadType: [ //可上传的文件类型
                    'image/png',
                    'image/jpeg',
                    'application/pdf', //pdf
                ],
                fileList:[]
            };
        },
        mounted() {
            this.token = this.$route.query.token;
            this.headers.token = this.token
        },

        methods: {
            beforeAvatarUpload(file) {
                this.data.fileName = file.name
                const isCanUpload = (this.canUploadType.indexOf(file.type) >= 0);
                if (!isCanUpload) {
                    this.$message.error('不支持的文件类型 ! ! !');
                }
                return isCanUpload;
            },
            getFileName(name){
              return  name.substring(name.lastIndexOf("."));
            },
            handleUpload(option) {
              // 获取文件的后缀名
              // let objName = getFileNameUUID()
              var obj = option.file.name
              var index = obj.lastIndexOf(".");      
              obj = obj.substring(index,obj.length);
              // 生成的文件名,保留文件后缀名,进行拼接      
              let objName = getFileNameUUID() + this.getFileName(option.file.name)
              // 调用 ali-oss 中的方法,flieName是存放的文件夹名称,可自己定义
              put(`flieName/${objName}`, option.file).then(putRes => {        
                console.log(putRes,'putRes')
                if(putRes.res.statusCode == 200) {
                      console.log('直传成功,写你的需要操作的业务逻辑')
                 }   
                // 上传成功之后,转换真实的地址
                signatureUrl(`flieName/${objName}`).then(signatureRes => {          
                    console.log(signatureRes)   
                      
                })
              })
            },
            submitUpload() {
              this.$refs.upload.submit();
            },
            handleRemove(file, fileList) {
              console.log(file, fileList);
            },
            handlePreview(file) {
              console.log(file);
            },
        },
    };
</script>

<style lang="scss" scoped>
</style>

Vue.js 和 Element UI 结合可以方便地构建用户界面,Element UI 的 `el-upload` 组件恰好提供了一个现成的解决方案来处理文件上传,包括阿里云 OSS(Object Storage Service)。以下是使用 `el-upload` 实现阿里云OSS文件上传的基本步骤: 1. **安装依赖**: 首先,在 Vue 项目中安装 `ali-oss` 和 `axios`,它们分别是阿里云OSS的官方客户库和用于发送HTTP请求的库: ``` npm install ali-oss axios ``` 2. **配置阿里云OSS**: 在你的项目中创建一个 `.env` 或者使用配置文件,添加阿里云访问信息,如 Access Key、Secret Key 和 bucket名称等: ```ini # .env or config.js ALI_OSS_ACCESS_KEY_ID=your_access_key_id ALI_OSS_SECRET_ACCESS_KEY=your_secret_access_key ALI_OSS_BUCKET_NAME=your_bucket_name ``` 3. **初始化OSS实例**: 在你的 Vue 组件里,导入必要的库,并使用环境变量初始化一个 OSS 对象: ```javascript import OSS from 'ali-oss'; const ossClient = new OSS({ accessKeyId: process.env.ALI_OSS_ACCESS_KEY_ID, secretAccessKey: process.env.ALI_OSS_SECRET_ACCESS_KEY, endpoint: 'http://oss-cn-hangzhou.aliyuncs.com', // 使用你所在区域的endpoint }); ``` 4. **`el-upload` 组件配置**: 将 `el-upload` 组件设置好,监听 `onSuccess` 事件并处理上传后的回调: ```html <template> <el-upload :action="uploadUrl" :on-success="handleSuccess" :before-upload="beforeUpload" ref="upload" multiple > <i class="el-icon-upload"></i> Click to Upload </el-upload> </template> <script> export default { data() { return { uploadUrl: '', // 这里需要拼接完整的上传URL,比如ossClient.putFile方法的结果 // 其他可能用到的变量 }; }, methods: { handleSuccess(response, file) { console.log('文件 ' + file.name + ' 上传成功'); ossClient.signURL(file.name).then(url => this.uploadUrl = url); // 获取上传到OSS的短链接 }, beforeUpload(file) { if (file.size > 1024 * 1024 * 5) { // 设置最大文件大小限制 message.error('File size exceeds the limit!'); return false; } return true; }, }, }; </script> ``` 5. **完整上传流程**: - 当用户选择文件后,组件会触发 `beforeUpload` 函数验证文件是否合法; - 如果合法,发起上传请求到 `uploadUrl`(通常由后生成,这里仅作示例); - 文件上传成功后,`handleSuccess` 会被调用,获取上传成功的 URL 并更新到页面上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peachSoda7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值