通过回形针上传图像时出现编码错误

时间:2012-12-05 00:14:10

标签: ruby-on-rails-3 file-upload encoding

我正在尝试将图片上传到回形针并将其保存到s3。但是,我在控制台中收到以下错误

!! Unexpected error while processing request: invalid byte sequence in UTF-8

StackOverflow上有一些关于如何解决这个问题的回复,尽管大多数回复指出原来的解决方案是对Rack的更新。但是,我正在使用Ruby 1.9.3和Rails 3.1.3,并且相信我没有Rack(我没有安装它作为Gem,我应该吗?)。

我一直在尝试的文件名非常简单,所以我假设问题出在实际文件中,但我不确定如何调试错误来自哪个上传变量。 Rails没有将任何这些错误放在日志文件中,所以我似乎无法获得更多细节。

我的控制器非常简单,就像paperclip github文档中的示例一样

 def create
   wine_photo = WinePhoto.create(params[:wine_photo])

   return render :json => wine_photo

  end

虽然最初我使用了更常见的

  wine_photo - WinePhoto.new(params[:wine_photo])
  if wine_photo.save
     return render :json => wine_photo
  else 
     return render :json => wine_photo.errors
  end

我的模型(我怀疑是非常有帮助的)是

class WinePhoto  true
    validates_with AttachmentPresenceValidator, :attributes => :photo

    belongs_to :wine
    belongs_to :user

    def photo_url
        photo.url
    end
end

根据stackoverflow上的这个响应Ruby Invalid Byte Sequence in UTF-8,我在我的控制器中尝试了以下内容

 def create
   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(file);
    var xhr = new XMLHttpRequest();
        if (xhr.upload && file.type == "image/jpeg" ) {

            // create progress bar
            var o = document.getElementById("progress");
            var progress = o.appendChild(document.createElement("p"));
            progress.appendChild(document.createTextNode("upload " + file.name));


            // progress bar
            xhr.upload.addEventListener("progress", function(e) {
                var pc = parseInt(100 - (e.loaded / e.total * 100));
                progress.style.backgroundPosition = pc + "% 0";
            }, false);

            // file received/failed
            xhr.onreadystatechange = function(e) {
                if (xhr.readyState == 4) {
                    progress.className = (xhr.status == 200 ? "success" : "failure");
                }
            };

            // start upload
            xhr.open("POST", document.getElementById("add_photo").action, true);
            xhr.setRequestHeader("X_FILENAME", file.name);
            xhr.send(file);
            }
        }

file的参数是

File {webkitRelativePath: "", lastModifiedDate: Thu Nov 10 2011 09:40:39 GMT+1100 (AUS Eastern Summer Time), name: "WP_000012.jpg", type: "image/jpeg", size: 1344450}

1 个答案:

答案 0 :(得分:0)

经过两天搞乱之后,事实证明问题出在我的ajax上传中,rails根本没有得到文件字段。

我按照这篇博文发布了ajax上传工作, https://github.com/newbamboo/example-ajax-upload/blob/master/public/index.html

并将输入文件中的名称更改为

< input type="file" name="wine_photo[photo]" >
,其名称仅为photo

html表单现在也有

<input name="utf8" type="hidden" value="✓">