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 \OSS\OssClient($accessKeyId, $accessKeySecret, $endpoint, True);
        // 生成GetObject的簽名URL。
        $signedUrl = $ossClient->signUrl($bucket, $object, $timeout);
    } catch (\OSS\Core\OssException $e) {
//        printf(__FUNCTION__ . ": FAILED\n");
//        printf($e->getMessage() . "\n");
        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 \OSS\OssClient($accessKeyId, $accessKeySecret, $endpoint);
        $ossClient->uploadFile($bucket, $object, $filePath);
    } catch(\OSS\Core\OssException $e) {
//        printf(__FUNCTION__ . ": FAILED\n");
//        printf($e->getMessage() . "\n");
        return false;
    }
//    print(__FUNCTION__ . ": OK" . "\n");
    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了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM