我正在尝试将图片上传到回形针并将其保存到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}
答案 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="✓">