zoukankan      html  css  js  c++  java
  • AWS S3 上传文件

    一、获取签名的URL

     通过后端给的接口拿到已经签名好的文件上传的URL地址

    二、读取文件(注:AWS 接受的二进制,不能使用form-data)

     // 获取文件二进制
        getFileMd5 = (key: string,callback: (value: any)=>void) => {
            const log: any = document.getElementById(key)
            const file = log.files[0]
    
            const reader = new FileReader();
    
            reader.onload =  () => {
                // console.log(reader.result);
                callback(reader.result)
            }
            reader.readAsBinaryString(file)
        }
    

      要在onload中去执行后续操作,reader.result返回文件的二进制

    三、提供接口所需要的header参数以及文件参数

    req.setRequestHeader('Content-MD5',md5Base64);
     req.setRequestHeader('x-amz-acl', 'public-read');
    md5Base64 是文件的二进制转base64后的值
    1、使用spark-md5将文件转为hash的二进制
    import SparkMD5 from 'spark-md5'
    
    const binaryFile = SparkMD5.hashBinary(fileValue,true)
    // fileValue 为上面读取文件的二进制值
    

      2、使用base64将二进制转为base64

    import Base64 from 'base-64'
      const md5Base64 = Base64.encode(binaryFile)
    // binaryFile 为上面的二进制文件
    

    四、拿到所有所需参数发送请求

     $.ajax({
                url,
                type: "PUT",
                data: file, // 源文件
                beforeSend: (req) => {
                    req.setRequestHeader('Content-MD5',md5Base64);
                    req.setRequestHeader('x-amz-acl', 'public-read');
                },
                processData: false, // 不想转换数据的时候,需要手动将其设置为false
                contentType: false, // 不设置content-type
                success:(res) => {
                    console.log('res',res)
                       const obj: any = {}
                       // 图片上传成功
                       switch(key) {
                           case 'mb_banner':
                               message.success('banner-mb图片上传成功!')
                                obj.mobile_banner_url = url.split('?')[0]
                                break
                           case 'pc_banner':
                                message.success('banner-pc图片上传成功!')
                                obj.banner_url = url.split('?')[0]
                                break
                           case 'icon':
                                message.success('分享icon图片上传成功!')
                                obj.icon_url = url.split('?')[0]
                                break
                           default: 
                               break
                       }
                       this.props.setBannerImg(obj)
    
                },error: err => {
                    switch(key) {
                        case 'mb_banner':
                            message.error('banner-mb图片上传失败!')
                            break
                        case 'pc_banner':
                             message.error('banner-pc图片上传失败!')
                             break
                        case 'icon':
                             message.error('分享icon图片上传失败!')
                             break
                        default: 
                            break
                    }
                    console.log(err)
                }
            });
    

      file: //let inputfile: any = document.getElementById(key)

        inputfile = inputfile.files[0]

  • 相关阅读:
    同一个ip、不同端口的两个应用,cookie竟然是可以互相访问到
    JS类型判断typeof、instanceof、Object.prototype.toString.call()
    js 控制一次加载一张图片,加载完成后再加载下一张
    cookie机制和session机制的区别
    Do not access Object.prototype method 'hasOwnProperty' from target object
    Vue 中使用mockjs模拟后端数据
    vue遍历数据字典
    this的用法
    关于html5的离线缓存(转帖)
    js正则 (二)
  • 原文地址:https://www.cnblogs.com/detanx/p/AwsUploadFile.html
Copyright © 2011-2022 走看看