파일을 S3에 업로드하는 웹 사이트를 heroku에 만들었습니다.

10009 단어 경 6S3
스마트 폰이라든지 클라이언트에 관계없이 업로드한 파일을 로컬 서버에 가져올 필요가 있었으므로, S3를 사용한 망비록입니다.

heroku에 웹 앱을 구축하는 방법은 아래를 참조하십시오.
twilio와 SendGrid와 heroku에서 경력 메일 대체 푸시 알림

heroku에서 flask 앱을 ​​실행하기 위한 환경 변수 설정


(venv)$heroku config:set FLASK_APP=upload.py
(venv)$heroku config:set FLASK_CONFIG=heroku

AWS S3에 액세스하기 위한 환경 변수 설정



S3의 버킷 이름과 IAM에서 사용자를 만들고 security credentials로 만든 access key
(venv)$heroku config:set S3BUCKET=S3バケット名
(venv)$heroku config:set AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx
(venv)$heroku config:set AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

웹 페이지의 기본 인증 암호를 환경 변수로 설정



사용자 이름은 소스 코드에 묻혀 (사용자)
(venv)$heroku config:set USER_PW=xxxxxxxx

소스 코드 등



requirements.txt
boto==2.49.0
Click==7.0
Flask==1.1.1
Flask-HTTPAuth==3.3.0
gunicorn==19.9.0
itsdangerous==1.1.0
Jinja2==2.10.3
MarkupSafe==1.1.1
Werkzeug==0.16.0

Procfile
web: gunicorn upload:app --timeout 15 --keep-alive 5 --log-level debug

소스 코드

upload.py
from flask import Flask, render_template, request, jsonify
from werkzeug import secure_filename
from flask_httpauth import HTTPDigestAuth
import boto
import os

'''
アプリコンストラクタ
'''
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'

'''
Digest認証
'''
auth = HTTPDigestAuth()

users = {
  "user": os.environ.get('USER_PW')
}

@auth.get_password
def get_password(username):
  if username in users:
    return users.get(username)
  return False

@auth.error_handler
def auth_error():
  response = jsonify({'error': 'unauthorized', 'message': 'Invalid credentials'}
)
  response.status_code = 401
  return response

'''
View設定
'''
@app.route('/upload')
@auth.login_required
def upload():
   return render_template('upload.html')

@app.route('/uploader', methods = ['GET', 'POST'])
def uploader():
   if request.method == 'POST':
      aws_access_key = os.environ.get('AWS_ACCESS_KEY_ID')
      aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
      s3bucket = os.environ.get('S3BUCKET')
      f = request.files['file']
      s3 = boto.connect_s3(aws_access_key, aws_secret_access_key)
      bucket = s3.get_bucket(s3bucket)
      key = bucket.new_key(secure_filename(f.filename))
      key.set_contents_from_file(f) 
      return 'file uploaded successfully'

if __name__ == '__main__':
   app.run(host='0.0.0.0', debug=True)

웹 페이지 템플릿

templates/upload.html
<html>
   <body>
      <form action = "/uploader" method = "POST" enctype = "multipart/form-data">
         <input type = "file" name = "file" />
         <input type = "submit"/>
      </form>
   </body>
</html>

업로드



예를 들어 iPhone에서 위에서 구축한 https://xxxxxxx-xxxxxx-xxxxxx.herokuapp.com/upload에 액세스하면 아래 왼쪽과 같이 인증하고 오른쪽(Choose File을 누른 후)과 같은 간단한 화면에서 파일을 선택하여 업로드할 수 있다.


로컬 서버에서 s3 마운트



위 웹 페이지에서 던진 파일을 s3fs로 로컬로 마운트할 수 있다.
sudo s3fs s3バケット名 /home/pi/s3fs_from/ -o allow_other -o uid=1000 -o gid=1000

좋은 웹페이지 즐겨찾기