1

画像をペーパークリップにアップロードしてs3に保存しようとしています。ただし、コンソールに次のエラーが表示されます

!! リクエストの処理中に予期しないエラーが発生しました: UTF-8 の無効なバイト シーケンス

この問題を解決する方法については、StackOverflow にいくつかの回答がありますが、ほとんどの回答は元の解決策が Rack の更新であることを示しています。しかし、私は Ruby 1.9.3 と Rails 3.1.3 を使用しており、Rack を持っていないと思います (Gem としてインストールしていませんよね??)。

私が試したファイル名はかなり単純なので、問題は実際のファイルにあると思いますが、エラーが発生しているアップロード変数をデバッグする方法がわかりません。Rails はこれらのエラーをログ ファイルに記録していないため、詳細はわかりません。

私のコントローラーは、ペーパークリップ github ドキュメントの例のように、かなり単純です。

デフォルト作成
   wine_photo = WinePhoto.create(params[:wine_photo])

   return render :json => wine_photo

  終わり

もともと私はより一般的なものを使用していましたが

  wine_photo - WinePhoto.new(params[:wine_photo])
  wine_photo.save の場合
     return render :json => wine_photo
  そうしないと
     return render :json => wine_photo.errors
  終わり

私のモデル(非常に役立つとは思えません)は

クラス WinePhoto true
    validates_with AttachmentPresenceValidator, :attributes => :photo

    所属先:ワイン
    所属先:ユーザー

    def photo_url
        写真のURL
    終わり
終わり

Ruby Invalid Byte Sequence in UTF-8 のこの応答に基づいて、コントローラーで以下を試しました

デフォルト作成
   wine_photo = WinePhoto.new(params[:wine_photo])
   wine_photo.photo = IO.read(wine_photo.photo).force_encoding("ISO-8859-1").encode("utf-8", replace: nil)
 ...

それでもエラーが発生しました。

このエンコーディングの問題を乗り越える方法について何か提案はありますか? アップロード中のファイルからエラーが発生していることを確認する方法はありますか?

私のアップロードコード(ajax)は

save_photo: function(){
        var file = document.getElementById('file_api').files[0];
        console.log(ファイル);
    var xhr = 新しい XMLHttpRequest();
        if (xhr.upload && file.type == "image/jpeg" ) {

            // プログレスバーを作成
            var o = document.getElementById("progress");
            var progress = o.appendChild(document.createElement("p"));
            progress.appendChild(document.createTextNode("アップロード" + file.name));


            // プログレスバー
            xhr.upload.addEventListener("進捗", 関数(e) {
                var pc = parseInt(100 - (e.loaded / e.total * 100));
                progress.style.backgroundPosition = pc + "% 0";
            }、 間違い);

            // ファイル受信/失敗
            xhr.onreadystatechange = function(e) {
                if (xhr.readyState == 4) {
                    progress.className = (xhr.status == 200 ? "成功" : "失敗");
                }
            };

            // アップロード開始
            xhr.open("POST", document.getElementById("add_photo").action, true);
            xhr.setRequestHeader("X_FILENAME", file.name);
            xhr.send(ファイル);
            }
        }

パラメータfile

ファイル {webkitRelativePath: "", lastModifiedDate: Thu Nov 10 2011 09:40:39 GMT+1100 (AUS 東部夏時間), name: "WP_000012.jpg", type: "image/jpeg", size: 1344450}

4

1 に答える 1

0

これを2日間いじった後、問題は私のajaxアップロードにあり、レールはファイルフィールドをまったく取得していなかったことがわかりました。

このブログ投稿に従って、ajax アップロードを機能させました。 https://github.com/newbamboo/example-ajax-upload/blob/master/public/index.html

入力ファイルの名前を次のように変更しました

< input type="file" name="wine_photo[写真]" >
名前の前はphoto.

HTMLフォームにも

<input name="utf8" type="hidden" value="✓"> 
于 2012-12-05T04:33:51.817 に答える