在Dokku的移动设备上使用Paperclip照片上传(S3)出错

时间:2018-05-19 16:42:03

标签: ruby-on-rails amazon-s3 paperclip digital-ocean dokku

更新

我使用具有Person模型和头像附件的回形针创建了一个非常简单的应用程序。然后我将它部署到一个全新的Dokku Droplet并遇到与我的主应用程序相同的问题。然后我读到了关于ActiveStorage的想法,并认为我可能会看到一些成功,所以我将简单的应用程序转换为使用ActiveStorage而不是Paperclip,但我仍然在从设备摄像头捕获的移动上传中遇到同样的问题。

这似乎与我所看到的Dokku问题一样(特别是因为功能在Heroku上运行),但我真的不知道从哪里开始。我没有任何处理移动上传的特殊代码。我使用simple_form作为表单控件,使用标准image_tag语法进行显示。我也使用Devise用户帐户(我添加到我的简单应用程序以及复制)。问题是,当我收到Dokku错误消息时,我的日志没有显示任何内容,它就像请求永远不会让我的手机关闭。

仍在寻找帮助,谢谢!

我的应用程序在我的模型上启用了可选照片和PDF附件的回形针上传功能。在尝试在Mobile(iOS)上附加文件时,除了我的生产服务器外,一切都很完美。

我正在使用Dokku(通过DigitalOcean)进行制作,使用Heroku进行测试。我使用Amazon S3存储文件上传。

使用:

  • 开发:从PC上传工作(此处无法在移动设备上进行测试)
  • 测试(Heroku):从PC和Mobile上传作品
  • 生产(Dokku / DO):所有上传均可在PC上运行。 PDF上传工作来自移动设备。如果选择手机中已有的照片,可以从手机上传照片。

不起作用

  • 制作(Dokku / DO):从手机上传照片(使用内置的iOS / Safari拍照功能)转到Dokku上的错误页面。错误页面显示"无法提供您要查找的页面。"

当我查看Dokku的应用程序日志时,我没有看到任何错误。当我尝试从移动设备上传时,我启用了实时模式日志(dokku日志应用程序-t)进行监控,一旦我点击提交按钮,没有向日志报告任何内容,它只是转到我设备上的错误页面。

我认为这是我的Dokku /部署配置的一个问题,因为它在Heroku中运行良好。我可能在Dokku方面遗漏了一些东西。我没有在Heroku上启用HTTPS,因为我使用免费套餐,但我确实通过LetsEncrypt在Dokku上启用了HTTPS。我不确定这是否是导致错误的原因。

无论如何,这是我的应用程序中的一些相关代码。任何想法都非常感激!

Model.rb

    has_attached_file :attachment,
        styles: { large: ["1000x1000>", :png], medium: ["300x300>", :png], thumb: ["100x100>", :png] }

    validates_attachment_content_type :attachment,
        content_type: [
          "image/jpg", 
          "image/jpeg", 
          "image/png", 
          "image/gif",
          "application/pdf",

          "file/txt",
          "text/plain",

          "application/doc",
          "application/msword", 

          "application/vnd.ms-excel",     
          "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
          ],
        message: "Sorry! We do not accept the attached file type"

model_controller.rb

    def transaction_params
        params.require(:transaction).permit(:trx_date, :description, :amount, :trx_type, :memo, :attachment, :attachment_file_name)
    end

配置/环境/ production.rb

  # Paperclip settings
  config.paperclip_defaults = {
    storage: :s3,
    s3_credentials: {
      bucket: ENV['S3_BUCKET_NAME'],
      access_key_id: ENV['AWS_ACCESS_KEY_ID'],
      secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
      s3_region: ENV['S3_REGION'],
      s3_host_name: ENV['S3_HOST_NAME']
    }
  }

输出" dokku配置myapp"

AWS_SECRET_ACCESS_KEY:    **masked**
S3_BUCKET_NAME:           mybucketname
DOKKU_APP_RESTORE:        1
DOKKU_NGINX_SSL_PORT:     443
S3_REGION:                us-east-2
AWS_ACCESS_KEY_ID:        **masked**
DOKKU_APP_TYPE:           herokuish
DOKKU_NGINX_PORT:         80
DOKKU_PROXY_PORT_MAP:     http:80:5000 https:443:5000
DATABASE_URL:             **masked**
DOKKU_LETSENCRYPT_EMAIL:  **masked**
S3_HOST_NAME:             s3.us-east-2.amazonaws.com

1 个答案:

答案 0 :(得分:2)

我通过安装Postman并使用代理服务器查看有关我手机客户端请求的更多详细信息来确定错误原因。我发现服务器返回错误413 Request Entity Too Large。

经过一番搜索,我发现我需要通过在我的app目录中添加文件来更新我的nginx配置

/home/dokku/<myapp>/nginx.conf.d/upload.conf

在该文件中,我插入了一行:

client_max_body_size 50M;

之后我重新启动了我的dokku容器,现在一切正常:)

感谢所有人的帮助