django - 上传文件时,有什么方法可以绕过托管我的 Django 站点的服务器,而是立即上传到 S3?
问题描述
我正在使用 boto3 将大量媒体文件(2GB+)从我的 Django 网站上传到 s3 存储桶。我的问题是上传大于 2.5MB 的文件时 - 连接立即超时并且没有调试信息显示
- 我假设正在发生的事情是 Django 正在使用临时文件上传处理程序,但临时文件处理程序无法在 Django 应用程序运行的服务器上运行(pythonanywhere 免费层)。
- 这在本地完美运行,因为它只需要复制到操作系统,而不是服务器。我想跳过网络服务器,所以我没有使用所有的存储/带宽
s3.upload_file
需要文件的本地路径才能将其上传到 S3,我能找到的唯一方法是获取文件的 temp_path。
# method to chunk the upload process if file is over 2.4MB
def s3_multipart_upload(f, video_id):
# our server path
file_path = "media/"
new_folder = str(video_id)+"/"
file_name = f.name
server_path = file_path + new_folder + file_name
# the file gets copied to ~/tmp/ so grab that path
local_path = f.temporary_file_path()
# create s3 client connection
s3 = boto3.client('s3', settings.AWS_S3_REGION_NAME, **credentials)
config = TransferConfig(
multipart_threshold=1024 * 25,
max_concurrency=10,multipart_chunksize=1024 * 25,
use_threads=True
)
s3.upload_file(
local_path,
settings.AWS_STORAGE_BUCKET_NAME,
server_path,
ExtraArgs={'ACL': 'public-read'},
Config=config,
Callback = ProgressPercentage(local_path)
)
return
我希望能够直接从我的网站直接上传到 S3,而不需要文件通过服务器(任何地方的 python)。如果有更清洁的方法,我应该使用更好的服务器,或者如果有一种方法可以上传文件而无需先复制到 temp - 我全神贯注。
(一般来说,我也是 Python/Django/Servers 的新手,因此感谢您的帮助)
解决方案
我不确定您是否找到了答案,但您可以使用签名 url 机制将内容直接上传到 s3。
- 从 django 后端请求 s3 的签名 URL
- 使用前端将内容目录上传到 s3
但我建议仅当您要上传更大的媒体文件时才这样做。
我发现这是安全的方法。 https://www.serverless.com/blog/s3-one-time-signed-url
推荐阅读
- java - 在 ListAdapter 中实现过滤器/搜索功能返回 UnsupportedOperationException
- java - 使用数学库的 Java 中的 Apache 简单线性回归
- go - 如何按顺序将字符串输入输入 bufio.Scanner 和 fmt.Scanln?
- visual-studio-code - 无法编辑默认 VSCode JSON 设置
- cakephp - Virtualize/Emulate/Catch-所有 PHP 文件在 /templates 目录
- python - Binance交易平台如何计算其VWAP值?移动间隔?从过去的固定日期开始?
- swiftui - 如何在 SwiftUI 的新地图视图中制作可点击的图钉?
- swift - 在 Swift 中编写多个尾随闭包的正确方法是什么?
- youtube-api - YouTube 数据 API:请求无法完成,因为您已超出配额 INSUFFICIENT_TOKENS
- java - 语音到语音识别 android studio