zoukankan      html  css  js  c++  java
  • 前端如何上传图片到七牛云

    From: https://www.jianshu.com/p/7520e0bee777

    前端如何上传图片到七牛云

    流程: 生成token => token和图片作为new FromData() 参数 再上传

    token

    const accessKey = 'TSlScX_akS5TIpsXlkq*****7Efk-ZaZeg4ZWtta';
    const secretKey = 'X-MGLySWVrWFIQKTn***WDIBvb3ni4Zm3qwZNKxk';
    const bucket = 'deluntiyun';
    
    如何获取这三个参数
    image.png

    accessKey 就是AK
    secretKey 就是SK

    image.png

    bucket 就是你的空间名字

    我的token是koa后台请求回来的,附上代码 node的话qiniu模块
    非node的话自行查询Node.js SDK

    let qiniu = require('qiniu'); // 需要加载qiniu模块的
    const accessKey = 'TSlScX_akS5TIpsXlkqHH2gy7Efk-ZaZeg4ZWtta';
    const secretKey = 'X-MGLySWVrWFIQKTn87HWDIBvb3ni4Zm3qwZNKxk';
    const bucket = 'deluntiyun';
    
    
    router.post('/token', async(ctx, next)=> {
        let mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
        let options = {
            scope: bucket,
            expires: 3600 * 24
        };
        let putPolicy =  new qiniu.rs.PutPolicy(options);
        let uploadToken= putPolicy.uploadToken(mac);
        if (uploadToken) {
            ctx.body = Code('re_success', uploadToken)
        } else {
            ctx.body = Code('re_error')
        }
    })
    

    token也是在前端来生成的, 加载qiniu模块,利用其方法就可以生成token

    上传到七牛云 - React

    upload组件 ice Upload 上传组件

    // 用来删除图片的
    onUploadChange(info) {
            if (info.file.status == 'removed') {
                this.setState({
                    fileList: [],
                    values: Object.assign({
                        avatar: ''
                    })
                })
            }
      }
    
    <Col xxs="16" s="10" l="6">
                      <IceFormBinder name="avatar" required message="必填">
                        <ImageUpload
                          listType="picture-card"
                          limit={1}
                          action={this.state.qiniu.url}
                          fileList={this.state.fileList}
                          accept="image/png, image/jpg, image/jpeg, image/gif, image/bmp"
                          data={this.state.qiniuToken}
                          locale={{
                            image: {
                              cancel: '取消上传',
                              addPhoto: '上传图片',
                            },
                          }}
                          formatter={(res)=>{
                                // 七牛云返回的数据  { hash:"FjIEDVNzhgmsU7cOBtkAXV7VuhvJ",key:"FjIEDVNzhgmsU7cOBtkAXV7VuhvJ"}
                                let imgURL = this.state.qiniu.qiniuPath + "/" + res.key;
                                this.setState({
                                        fileList: [{
                                            status: "done",
                                            downloadURL: imgURL,
                                            fileURL: imgURL,
                                            imgURL: imgURL
                                        }],
                                        value: Object.assign(this.state.value, {
                                            avatar: imgURL
                                        })
                                    })
                          }}
                          onChange= {this.onUploadChange.bind(this)}
                        />
                      </IceFormBinder>
                    </Col>
    

    附上网友大神的ice组件代码,虽然不是用七牛云的

    52A911F6-D3A8-4cb0-A041-202644CCA761.png

    上传到七牛云 - Vue

    ui框架 element-ui el-upload

    koa2 请求到七牛云的token

    let qiniu = require('qiniu'); // 需要加载qiniu模块的
    const router = require('koa-router')()
    router.prefix('/api/admin/qiniu')
    
    let config = {
        "AK":"TSlScX_akS5TIpsXlkqHH2gy7Efk-ZaZeg4ZWtta",
        "SK":"X-MGLySWVrWFIQKTn87HWDIBvb3ni4Zm3qwZNKxk",
        "Bucket":"mobile-phone-shell"
    }
    
    router.post('/token', async(ctx, next)=> {
        let mac = new qiniu.auth.digest.Mac(config.AK, config.SK);
        let code = '1',msg = '', data = {};
        let options = {
            scope: config.Bucket,
            expires: 3600 * 24
        };
        let putPolicy =  new qiniu.rs.PutPolicy(options);
        let uploadToken= putPolicy.uploadToken(mac);
        if (uploadToken) {
            code = '0';
            data.uploadToken = uploadToken;
            ctx.body = {code, data, msg}
        } else {
            ctx.body = {code, data, msg}
        }
    })
    
    module.exports = router
    

    前端代码

    <el-upload
    <el-upload
                          style='position: relative;top: 10px;height: 120px;'
                          :file-list='fileList'
                          class="avatar-uploader"
                          :limit='1'
                          :action="uploadUrl"
                          accept="image/jpeg,image/gif,image/png,image/bmp"
                          list-type="picture-card"
                          :data='uploadData'
                          :on-success="handleAvatarSuccess"
                          :on-error="uploadError"
                          :before-upload="beforeAvatarUpload"
                          :on-preview="doLookImg"
                          :on-remove="doDeleteImg">
                          <i class="el-icon-plus"></i>
                        </el-upload>
    <script>
      export default {
        data() {
          return {
              uploadUrl: 'http://up-z0.qiniu.com',
              uploadData: {key:'',token:''},
              formAdd: { brandLogo: '' }
          }
        },
        mounted() {
            getQiniuToken({}).then((res)=> {
              console.log(res);
              if (res.code === '0') {
                this.uploadData.token = res.data.uploadToken
              }
            })
      },
        methods: {
          doDeleteImg(file, fileList) {
            console.log('删除成功',file, fileList)
            let logoAry;
            let key;
            if (this.editState) {
              logoAry = this.mainInfo.brandLogo.split('/');
            } else {
              logoAry = this.formAdd.brandLogo.split('/');
            }
            key = logoAry[logoAry.length - 1];
            deleteQiniuImg({key}).then(res=> {
              if (res.code === '0') {
                if (this.editState) {
                  this.mainInfo.brandLogo = '';
                } else {
                  this.formAdd.brandLogo = '';
                }
              } else {
                this.$message.error(res.msg)
              }
            })
          },
          doLookImg() {
            this.uploadDialogVisible = true;
            this.uploadDialogImg = this.editState ? this.mainInfo.brandLogo : this.formAdd.brandLogo;
          },
          handleAvatarSuccess(res, file, fileList) {
            console.log('上传成功', res,file, fileList)
            let hash = res.hash;
            let key = res.key;
            if (this.editState) {
              this.mainInfo.brandLogo = qiniuConfig.qiniuPath + '/' + key;
            } else {
              this.formAdd.brandLogo = qiniuConfig.qiniuPath + '/' + key;
            }
          },
          beforeAvatarUpload(file) {
            console.log(file, 'beforeAvatarUpload')
            // var observable = qiniu.upload(file, key, token, putExtra, config)
            const isPNG = file.type === "image/png";
            const isJPEG = file.type === "image/jpeg";
            const isJPG = file.type === "image/jpg";
            const isLt2M = file.size / 1024 / 1024 < 2;
    
            if (!isPNG && !isJPEG && !isJPG) {
              this.$message.error("上传头像图片只能是 jpg、png、jpeg 格式!");
              return false;
            }
            if (!isLt2M) {
              this.$message.error("上传头像图片大小不能超过 2MB!");
              return false;
            }
            this.uploadData.key = `upload_pic_${new Date().getTime()}_${file.name}`;
          },
          uploadError(err, file, fileList) {
            this.$message({
              message: "上传出错,请重试!",
              type: "error",
              center: true
            });
          },
        }
    }
    </script>
    
    
  • 相关阅读:
    Mysql 导入CSV数据 语句 导入时出现乱码的解决方案
    有用的 Mongo命令行 db.currentOp() db.collection.find().explain()
    MySql Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 解决方法 -摘自网络
    MongoDB索引相关文章-摘自网络
    批量更新MongoDB的列。
    RabbitMQ 消费端 Client CPU 100%的解决办法
    php根据命令行参数生成配置文件
    php解释命令行的参数
    使用memcache对wordpress优化,提速
    python基础技巧综合训练题2
  • 原文地址:https://www.cnblogs.com/joeblackzqq/p/11537840.html
Copyright © 2011-2022 走看看