私はDropzone addon(ember-cli-dropzonejs)を使ってEmberで画像をアップロードしました。Rails 5はサーバ(Ubuntu 14.x)上で動作していますが、imagemagickはRails Docker Containerにインストールされており、すべてのファイルは "uploads"フォルダに移動します。 すべてがdockerコンテナとして実行されているので、rails、frontend、databaseおよびnginx(1.11.4)は別々のコンテナです。 イメージをアップロードしようとすると、サーバーの応答は405で、レールには何も取得されませんでした(ログには何も表示されません)。nginx 405 - imberをemberからレールにアップロード
燃えさしHBS
{{drop-zone url=uploadURL
method='PATCH'
headers=authentication acceptedFiles='.jpg, .jpeg, .gif, .png'
resize=''
maxFilesize='10'
dictDefaultMessage='Upload file'
success=(action 'succesfulFileUpload')
complete=resetUploader
previewTemplate='<div></div>'
uploadprogress=progressManipulation
sending=sending
}}
レールを提出uploader.rb
class AvatarUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
# Choose what kind of storage to use for this uploader:
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
version :thumb do
process resize_to_fill: [200, 200]
end
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
def extension_whitelist
%w(jpg jpeg gif png)
end
# Override the filename of the uploaded files:
# Avoid using model.id or version_name here, see uploader/store.rb for details.
def filename
return unless original_filename
contenttype = original_filename.split('.').last
"avatar.#{contenttype}"
end
end
nginxの設定ファイル
server {
listen 443 ssl;
server_name example.com;
....
ssl stuff
....
location/{
proxy_read_timeout 150;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://backend:3000;
}
}
私はneginxの設定に次の行(のようなStackOverflowの上で100回を推奨)...
error_page 405 =200 $uri;
を置く場合...サーバーがエラーをスローします。
Can not read property 'attributes' of undefined
このエラーメッセージはdropzoneからです。アップロードを完了できません。レールには何もありません、何も...
UPDATE & SOLUTION私はそれを修正 Finaly、ログにエントリを受けていません。問題は、Handlebarsの間違ったuploadURLでした。これは相対パスであるため、ローカルの間違ったURLで作業しました。しかし、生産には廃止された道が必要でした。
あまりにも多くのコンテナについて、フロントエンドについては何もしていません。 emberからサーバーにファイルをアップロードするために使用するアドオンやコードに関する簡単な情報を含めるとすばらしいことでしょう。あなたのフロントエンドがファイルを送信するかどうか確認しましたか?多分それはしません。デベロッパーツール(ChromeではCtrl + Shift + I)、そのための[ネットワーク]タブを使用する必要があります。 –
405は「メソッドがサポートされていません」です。送信側で何かが間違っている可能性があります。また、 'error_page 405 = 200 $ uri;'のような欺瞞を避けるべきです。 Webサーバーに「405エラーが発生した場合は、ステータスを200に変更して処理を続行するかどうか」を伝えるだけです。実際のプロジェクトでそれをするのは間違っています。 –
「詳細のリクエスト」リンクに注目しました。 PATCHメソッドを使用します。これはおそらくnginxではサポートされていません。メソッドをPOSTに変更する方法を見つける必要があります(あなたのアプリケーションで)。私はあなたがアップロードするために何を使用するのか分からないので、より詳細な答えを与えることはできません。 [this](https://github.com/FutoRicky/ember-cli-dropzonejs)のdropzoneの場合、コンポーネントにmethod = "post"パラメータを追加すると便利です。 –