【问题标题】:Django - Larger files failing to upload to herokuDjango - 较大的文件无法上传到heroku
【发布时间】:2020-08-05 08:02:06
【问题描述】:

我在向 Heroku 上托管的 django 应用发帖时遇到问题。我有一个提交 3 张图片的表单,当我使用大约 100kb 的较小图片时,一切正常,但是当我使用 ~3MB 的较大图片时,上传失败,heroku 日志中的错误显示为at=error code=H13 desc="Connection closed without response" method=POST path="/"

在 django 中,我只是保存图像然后通过电子邮件发送它们,如下所示,其中 formdata 保存图像。希望sn-p就足够了:

for each in form_data:
    pic = form_data[each]
    if pic:
        filename = os.path.join(self.location,f"{i} - {pic.name}")
        imgbytes = pic.read()
        with open(filename, 'wb+') as destination:
            destination.write(imgbytes)

        i+=1
        fileholder.append(filename)
email = EmailMessage(
        subject = 'Hello',
        body = 'Body goes here',
        from_email = 'example@yahoo.com',
        to = ['test@google.com'],
        )

for each in fileholder:
    email.attach_file(each)
email.attach_file(newpath)
email.send()

这是什么原因造成的?如何确保成功上传任何大小的图片?

【问题讨论】:

  • 您好,您使用的是什么版本的 django?
  • @MSR974 我正在使用 Django 3.0.5

标签: python django heroku


【解决方案1】:

好的,所以我发现 heroku 上的所有请求都会在 30 秒后超时,这就是我的情况。上传时间比这更长,我的解决方案是处理上传客户端并直接上传到 S3。

更多信息here

【讨论】:

    【解决方案2】:

    Django 有一个设置DATA_UPLOAD_MAX_MEMORY_SIZE 阻止上传大于 2.5MB 的文件(默认值:2621440(即 2.5 MB))并引发 SuspiciousOperation (RequestDataTooBig) 异常

    尝试在您的 settings.py 中更改它

    【讨论】:

    • 嗨,我增加到DATA_UPLOAD_MAX_MEMORY_SIZE = 262144000,但错误仍然存​​在。
    • 我也设置了FILE_UPLOAD_MAX_MEMORY_SIZE = 262144000,但仍然是同样的错误。在本地测试时一切正常,但不知道为什么。
    • 你的服务器在 nginx 网络服务器后面吗?可能是 nginx 限制了您的 uploads
    • 我只是使用免费的 heroku 层,不确定是否有 nginx 或如何编辑它。我也尝试过数字海洋,甚至在我设置任何 nginx 之前也会发生这种情况。
    【解决方案3】:

    据我所知,几乎所有的网络框架都会在一个请求中限制数据的大小。比如Django,Tornado,Spring

    而且不安全,如果不限制一个请求的最大大小。

    正如 MSR974 所说,更改DATA_UPLOAD_MAX_MEMORY_SIZE,这是一种更改有关一个请求的最大大小设置的方法。但是在您的问题中:确保成功上传任何图像大小。关键字是any size

    尝试分段上传?

    将一个文件拆分为两个或多个文件,上传到后端后按顺序合并。(希望我解释清楚)

    【讨论】:

    • 嗨,我会尝试调查一下,我认为拆分必须使用 javascript 完成,但我并不擅长。会研究。该应用程序将用于注册人员,他们会上传一些图像以进行识别。上传的每张图片通常都很小,大约 300kb,但时不时有人有一个 2-3MB 的文件。
    • @West 当然,拆分应该使用 javascript。如果你不熟悉 javascript,试着像 MSR974 说的那样做。另外,还有一种方法是在上传之前尝试压缩图片或修改大小(:只知道如何使用js,但不太擅长js可以做到。)。关于解决问题的三种方法。如果你不希望使用js。确保人们上传的图片不能大于你设置的。关键字any size不能提供。
    • 谢谢,我会试一试的。ddnt 知道上传这么复杂。
    猜你喜欢
    • 2017-01-18
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2018-12-15
    • 2012-03-11
    • 1970-01-01
    • 2013-08-24
    • 2019-01-21
    相关资源
    最近更新 更多