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])

   返回渲染:json => wine_photo

  结尾

虽然最初我用的是更常见的

  wine_photo - WinePhoto.new(params[:wine_photo])
  如果 wine_photo.save
     返回渲染:json => wine_photo
  别的
     返回渲染:json => wine_photo.errors
  结尾

我的模型(我怀疑这很有帮助)是

类 WinePhoto 真实
    validates_with AttachmentPresenceValidator, :attributes => :photo

    属于:葡萄酒
    属于_to:用户

    def photo_url
        照片.url
    结尾
结尾

基于stackoverflow上的这个响应,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", 替换:nil)
 ...

但仍然有错误。

有关如何解决此编码问题的任何建议?有没有办法确认错误来自正在上传的文件?

我的上传代码(ajax)是

保存照片:函数(){
        var file = document.getElementById('file_api').files[0];
        控制台.log(文件);
    var xhr = new 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("进度", function(e) {
                var pc = parseInt(100 - (e.loaded / e.total * 100));
                progress.style.backgroundPosition = pc + "% 0";
            }, 错误的);

            //文件接收/失败
            xhr.onreadystatechange = 函数(e){
                如果(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 Eastern Summer Time), name: "WP_000012.jpg", type: "image/jpeg", size: 1344450}

4

1 回答 1

0

在搞砸了两天之后,事实证明问题出在我的 ajax 上传中,rails 根本没有获取文件字段。

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

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

<输入类型=“文件”名称=“葡萄酒照片[照片]”>
名字之前在哪里photo

html表单现在也有

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