s3.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import os
  2. from io import BytesIO
  3. import boto3
  4. import requests
  5. from app.config import (
  6. AWS_REGION,
  7. BUCKET,
  8. AWS_ACCESS_KEY_ID,
  9. AWS_SECRET_ACCESS_KEY,
  10. LOCAL_FILE_UPLOAD,
  11. UPLOAD_DIR,
  12. URL,
  13. )
  14. if not LOCAL_FILE_UPLOAD:
  15. _session = boto3.Session(
  16. aws_access_key_id=AWS_ACCESS_KEY_ID,
  17. aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
  18. region_name=AWS_REGION,
  19. )
  20. def upload_from_bytesio(key: str, bs: BytesIO, content_type="string"):
  21. bs.seek(0)
  22. if LOCAL_FILE_UPLOAD:
  23. file_path = os.path.join(UPLOAD_DIR, key)
  24. file_dir = os.path.dirname(file_path)
  25. os.makedirs(file_dir, exist_ok=True)
  26. with open(file_path, "wb") as f:
  27. f.write(bs.read())
  28. else:
  29. _session.resource("s3").Bucket(BUCKET).put_object(
  30. Key=key,
  31. Body=bs,
  32. ContentType=content_type,
  33. )
  34. def upload_email_from_bytesio(path: str, bs: BytesIO, filename):
  35. bs.seek(0)
  36. if LOCAL_FILE_UPLOAD:
  37. file_path = os.path.join(UPLOAD_DIR, path)
  38. file_dir = os.path.dirname(file_path)
  39. os.makedirs(file_dir, exist_ok=True)
  40. with open(file_path, "wb") as f:
  41. f.write(bs.read())
  42. else:
  43. _session.resource("s3").Bucket(BUCKET).put_object(
  44. Key=path,
  45. Body=bs,
  46. # Support saving a remote file using Http header
  47. # Also supports Safari. More info at
  48. # https://github.com/eligrey/FileSaver.js/wiki/Saving-a-remote-file#using-http-header
  49. ContentDisposition=f'attachment; filename="{filename}.eml";',
  50. )
  51. def upload_from_url(url: str, upload_path):
  52. r = requests.get(url)
  53. upload_from_bytesio(upload_path, BytesIO(r.content))
  54. def get_url(key: str, expires_in=3600) -> str:
  55. if LOCAL_FILE_UPLOAD:
  56. return URL + "/static/upload/" + key
  57. else:
  58. s3_client = _session.client("s3")
  59. return s3_client.generate_presigned_url(
  60. ExpiresIn=expires_in,
  61. ClientMethod="get_object",
  62. Params={"Bucket": BUCKET, "Key": key},
  63. )
  64. def delete(path: str):
  65. if LOCAL_FILE_UPLOAD:
  66. os.remove(os.path.join(UPLOAD_DIR, path))
  67. else:
  68. o = _session.resource("s3").Bucket(BUCKET).Object(path)
  69. o.delete()