• oss使用一些记录,flask上传文件到oss,授权预览或下载私有文件


    一. oss如果是商品图片等公共文件,要设置成公共读,其他情况设置成私有

    二. 

    python flask框架上传文件到oss

    class UploadAtt(Resource):
        @jwt_required
        def post(self):
            file = request.files.get('file', None)
            parmat = request.form.get('param', None)
            if not file or file.filename == '':
                return func.resp(status=400, mess='文件不存在')
            filename = secure_filename(file.filename)
            if not func.allowed_file(filename):
                return func.resp(status=400, mess='文件格式不允许')
            # file.save(os.path.join(current_app.config['UPLOAD_FOLDER'], filename))
            filename = func.gen_upload_filename(filename, parmat)
            if not filename:
                return func.resp(status=400, mess='参数错误')
            oss = FlaskOSS(current_app)
            oss.put_file(filename, file.read())
            ret = {'filepath': func.get_oss_url_by_file(filename), 'filename': filename}
            return func.resp(ret, status=200, mess='File successfully uploaded')

      

    python flask框架,授权预览或下载私有文件, 图片文件使用自定义域名可以预览,其他文件默认下载

    def get_oss_url_by_file(filename, expire=600):
        if not filename:
            return None
        if filename[0:1] == '/':
            filename = filename[1:]
        # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
        auth = oss2.Auth(current_app.config['OSS_ACCESS_KEY_ID'], current_app.config['OSS_SECRET_ACCESS_KEY'])
        # Endpoint以杭州为例,其它Region请按实际情况填写。
        bucket = oss2.Bucket(auth, current_app.config['OSS_ENDPOINT_CNAME'], current_app.config['OSS_BUCKET_NAME'], True)
        # 设置此签名URL在60秒内有效。
        return bucket.sign_url('GET', filename, expire)

    python flask框架下载文件到本地,   本地目录我使用的当前文件夹下/download,要新建这个文件夹

    # 下载文件
    class OrderAtt(Resource):
        def get(self):
            filename = request.args.get('filepath', None)
            filetitle = request.args.get('filetitle', None)
            if not all([filename, filetitle]):
                return func.resp(status=400, mess="参数不能为空")
            if filename[0:1] == '/':
                filename = filename[1:]
            # 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
            auth = oss2.Auth(current_app.config['OSS_ACCESS_KEY_ID'], current_app.config['OSS_SECRET_ACCESS_KEY'])
            # Endpoint以杭州为例,其它Region请按实际情况填写。
            bucket = oss2.Bucket(auth, current_app.config['OSS_ENDPOINT_CNAME'], current_app.config['OSS_BUCKET_NAME'],
                                 True)
            # 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。
            #  <yourLocalFile>由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt。
            #  <yourObjectName>表示下载的OSS文件的完整名称,即包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
            directory = os.getcwd()+'/download/'  # 假设在当前目录
            localfile = directory + filetitle
            bucket.get_object_to_file(filename, localfile)
            return func.resp()
    

      

    python flask框架删除文件

        @jwt_required
        def delete(self):
            filename = request.args.get('filename', None)
            if not filename:
                return func.resp(status=400, mess='参数错误')
            oss = FlaskOSS(current_app)
            oss.del_file(filename)
            return func.resp()
    

     

    三. php thinkphp上传 预览,

    function getossurl($object){
        if(!$object){
            return null;
        }
        Vendor('aliyun-oss.autoload');
        if(substr($object,0,1)=='/'){
            $object = substr($object,1);
        }
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
        $accessKeyId = C("OSS_ACCESS_KEY_ID");
        $accessKeySecret = C("OSS_SECRET_ACCESS_KEY");
    // Endpoint以杭州为例,其它Region请按实际情况填写。
        $endpoint = C("OSS_ENDPOINT_CNAME");
        $bucket= C("OSS_BUCKET_NAME");
    
    // 设置URL的有效时长为3600s。
        $timeout = 3600;
        try {
            $ossClient = new OSSOssClient($accessKeyId, $accessKeySecret, $endpoint, True);
            // 生成GetObject的签名URL。
            $signedUrl = $ossClient->signUrl($bucket, $object, $timeout);
        } catch (OSSCoreOssException $e) {
    //        printf(__FUNCTION__ . ": FAILED
    ");
    //        printf($e->getMessage() . "
    ");
            return null;
        }
        return $signedUrl;
    }
    
    function upload2oss($filePath,$object){
        if(!$filePath){
            return false;
        }
        Vendor('aliyun-oss.autoload');
        if(substr($object,0,1)=='/'){
            $object = substr($object,1);
        }
    // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
        $accessKeyId = C("OSS_ACCESS_KEY_ID");
        $accessKeySecret = C("OSS_SECRET_ACCESS_KEY");
    // Endpoint以杭州为例,其它Region请按实际情况填写。
        $endpoint = C("OSS_ENDPOINT");
        $bucket= C("OSS_BUCKET_NAME");
        try{
            $ossClient = new OSSOssClient($accessKeyId, $accessKeySecret, $endpoint);
            $ossClient->uploadFile($bucket, $object, $filePath);
        } catch(OSSCoreOssException $e) {
    //        printf(__FUNCTION__ . ": FAILED
    ");
    //        printf($e->getMessage() . "
    ");
            return false;
        }
    //    print(__FUNCTION__ . ": OK" . "
    ");
        return true;
    }
    

      

     

    问题:oss优化,app和pc都是ajax直接上传到oss,如果上传文件后返回或删除文件或没有提交,对应的文件也应该删除.

    处理方式, 1先上传到oss tmp文件夹,并定时清理, 如果post请求成功,再拷贝到对应文件夹,这样就节省服务器资源和oss费用  或者  先上传到服务器的 tmp文件夹,并定时清理, 如果post请求成功,再上传到oss中
    2.tmp文件定时清理时间大于保持登录的时间.refreshtoken或cookie或session到期时间. 这样用户添加后,到期必须重新登录,就不用判断文件是否存在.
    cookie不设置到期时间或设置0,都是浏览器关闭就销毁
    cookie设置到期时间,默认保存在内存中或硬盘中,也可以保存到数据库,到期时间之前关闭浏览器不会销毁,重新打开还是已经登录状态.
    session基于cookie,浏览器关闭sessionid就销毁了,所以找不到对应的session了.

  • 相关阅读:
    (转)MapReduce源码分析总结
    Linux SSH远程文件/目录传输命令scp
    Hadoop学习总结:MapReduce的过程解析
    Python 3 的新特性zz
    Tutorial Learn Python in 10 minutes[zz]
    Hadoop学习总结:Hadoop的运行痕迹
    Python 绝对简明手册
    Linux命令总结
    [Error] 'strlen' was not declared in this scope
    养成C#编程好习惯
  • 原文地址:https://www.cnblogs.com/jackduan/p/13655232.html
Copyright © 2020-2023  润新知