我正在为 Django 应用程序创建一个 API,其中一个 PUT 请求允许上传(非常)大文件。我正在尝试在 Heroku 上托管应用程序,但在文件上传、30 秒限制和临时文件系统方面遇到了一些问题。我现在正在尝试将文件传递到 s3 存储桶(通过 boto 并滥用该multipart_upload
功能),但在上传完成之前该过程即将结束。我很早就发现了这个非常有用的答案,这对于一般的 API 来说是极好的建议,但并不能解决 Heroku 问题。
在我看来
for i, handler in enumerate(upload_handlers):
chunk = request.read(handler.chunk_size)
while chunk:
handler.write_multipart_upload(chunk, counters[i], filename=file_name)
counters[i] += len(chunk)
chunk = request.read(handler.chunk_size)
for i, handler in enumerate(upload_handlers):
file_obj = handler.file_complete(counters[i])
在我的处理程序中
def write_multipart_upload(self, raw_data, start, filename=None):
if not self.mp:
self._validate_file(filename=filename)
self.mp = self.bucket.initiate_multipart_upload('feeds/' + self.file_name)
self.buffer.write(raw_data)
if self.buffer.len:
self.buffer.seek(0)
self.mp.upload_part_from_file(self.buffer, self.total_chunks)
self.buffer.close()
self.buffer = StringIO()
def file_complete(self, file_size):
self.mp.complete_upload()
self.file
也许这变得太复杂了。在这一点上,我正在寻找简单且可维护的东西。如果有人有一个基于 PUT 的大文件上传 API 的可靠示例,我会废弃 Heroku 并对此感到满意。提前致谢。