2016-12-13 3 views
0

필자는 Fineuploader를 사용하여 파일을 S3에 업로드하는 것과 클라이언트에서 직접 업로드하는 것보다 백엔드를 통해 파일을 프록시 처리하는 전통적인 방법을 사용하는 것의 차이점을 알 수있는 방법을 알고 있습니다. 여기에 필자가 가지고있는 백엔드 코드는 Fineuploader Github에서 가져 와서 내 usecase를 약간 수정했습니다. 클라이언트 측에 업로드가 처음에 백엔드 서버를 통해 프록시하지 않고 "직접"S3로 이동하는 것을 확인하는 방법은 무엇입니까?

#!/usr/bin/env python 
# 
# app.py 
# 
# by: Mark Feltner 
# 
# Server-side S3 upload example for Fine Uploader 
# 
# Features: 
# * Upload to S3 
# * Delete from S3 
# * Sign Policy documents (simple uploads) and REST requests (chunked/multipart) 
# uploads 
# * non-CORS environment 

import base64, hmac, hashlib, os, sys 
from flask import (Flask, abort, json, jsonify, make_response, render_template, request) 
from boto.s3.connection import Key, S3Connection 

AWS_CLIENT_SECRET_KEY = '********************************' 
AWS_SERVER_PUBLIC_KEY = '************************' 
AWS_SERVER_SECRET_KEY = '*********************************' 
AWS_EXPECTED_BUCKET = 'mybucket' 
AWS_MAX_SIZE = 1500000000 

app = Flask(__name__, template_folder='static', static_url_path='/static') 
app.config.from_object(__name__) 
app.debug = True 


def sign_policy(policy): 
    """ Sign and return the policy document for a simple upload. 
    http://aws.amazon.com/articles/1434/#signyours3postform """ 
    signed_policy = base64.b64encode(policy) 
    signature = base64.b64encode(hmac.new(
     app.config.get('AWS_CLIENT_SECRET_KEY'), signed_policy, hashlib.sha1). 
           digest()) 
    return {'policy': signed_policy, 'signature': signature} 


def sign_headers(headers): 
    """ Sign and return the headers for a chunked upload. """ 
    return { 
     'signature': base64.b64encode(hmac.new(
      app.config.get('AWS_CLIENT_SECRET_KEY'), headers, hashlib.sha1). 
             digest()) 
    } 


@app.route("/s3/sign", methods=['POST']) 
def s3_signature(): 
    """ Route for signing the policy document or REST headers. """ 
    request_payload = request.get_json() 
    if request_payload.get('headers'): 
     response_data = sign_headers(request_payload['headers']) 
    else: 
     response_data = sign_policy(request.data) 
    return jsonify(response_data) 


@app.route("/s3handler/<key>", methods=['POST', 'DELETE']) 
def s3_delete(key=None): 
    """ Route for deleting files off S3. Uses the SDK. """ 
    try: 
     s3 = S3Connection(app.config.get("AWS_SERVER_PUBLIC_KEY"), 
          app.config.get("AWS_SERVER_SECRET_KEY")) 
     request_payload = request.values 
     bucket_name = request_payload.get('bucket') 
     key_name = request_payload.get('key') 
     aws_bucket = s3.get_bucket(bucket_name, validate=False) 
     aws_key = Key(aws_bucket, key_name) 
     aws_key.delete() 
     return make_response('', 200) 
    except ImportError: 
     abort(500) 


@app.route("/s3/success", methods=['GET', 'POST']) 
def s3_success(): 
    """ Success redirect endpoint for <=IE9. """ 
    return make_response('', 200) 


@app.route("/") 
def index(): 
    return render_template("index.html") 


def main(argv=None): 
    app.run('0.0.0.0') 

    return 0 # success 


if __name__ == '__main__': 
    status = main() 
    sys.exit(status) 

뺀 UI 코드, 나는 클라이언트 이것은 나를 위해 작동

<script> 
    var uploader = new qq.s3.FineUploader({ 
     debug: true, 
     element: document.getElementById('fine-uploader'), 
     request: { 
      endpoint: 'mybucket.s3.amazonaws.com', 
      accessKey: '***************' 
     }, 
     signature: { 
      endpoint: '/s3/sign' 
     }, 
     uploadSuccess: { 
      endpoint: '/s3/success' 
     }, 
     iframeSupport: { 
      localBlankPagePath: '/success.html' 
     }, 
     retry: { 
      enableAuto: true // defaults to false 
     }, 
     chunking: { 
      enabled: true 
     }, 
     deleteFile: { 
      enabled: true, 
      endpoint: '/s3handler' 
     } 
    }); 
</script> 

하여 요청을 처리하기 위해이 스크립트를 가지고있다. 업로드 된 파일은 내 S3 버킷에 나타납니다. 백엔드에 정책 파일에 서명 한 다음 계속하기 만하면 S3에 "직접"업로드하는 것으로 가정합니다. 이 올바른지? 직접 업로드하는 대신 백엔드를 통과해야하는 경우 다르게 수행되는 작업은 무엇입니까? qq.s3.FineUploader

업로드하려면 레이 Nicholus 직접 S3 또는 다른 서버에 업로드하는 업로드 차이 일부 정화 후

+1

"차이점을 말하니?" S3 :'qq.s3.FineUploader'에 직접 업로드하십시오. 원하는 서버 인'qq.FineUploader'에 업로드하십시오. –

+0

그것이 제가 찾고 있었던 차이입니다! 두 가지 API 메소드. 고마워요 @ 레이 니콜러스 – aaron

+0

질문에 대한 답변을 게시하십시오. –

답변

1

는 Fineuploader 클라이언트 측 방법 직접 S3에

업로드에 원하는 서버 : qq.FineUploader