当前位置: 首页 > 知识库问答 >
问题:

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

穆嘉
2023-03-14

我正在尝试将图像上传到回形针并将其保存到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没有将这些错误放入日志文件,所以我似乎无法获得更多的细节。

我的控制器相当简单,就像回形针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

基于堆栈溢出的响应,UTF-8中的Ruby无效字节序列,我已经在我的控制器中尝试了以下方法

 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个答案

阳狐若
2023-03-14

经过两天的折腾,问题出在我的ajax上传上,rails根本没有得到文件字段。

我关注了这篇博客文章,让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="✓"> 
 类似资料:
  • 问题内容: 我无法通过ajax上传多个文件。这是我的代码。 HTML代码: Ajax代码:- 当我通过Ajax调用upload_business_photo_do()函数时,它无法获取图像$ _FILES [‘file’] [‘name’]的名称 问题答案: 尝试这样使用,它简单又容易 并在控制器中使用像这样 并使用此功能将文件数据转换为多个图像数据的数组 它的工作完美,只需尝试使用它。您无需使用

  • 问题内容: 昨天我做了一个深夜的编码会议,并创建了一个小的node.js / JS(实际上是CoffeeScript,但是CoffeeScript只是JavaScript,所以可以说是JS)应用程序。 目标是什么: 客户端(通过socket.io)将canvas datauri(png)发送到服务器 服务器将图像上传到亚马逊s3 步骤1完成。 服务器现在有一个字符串 我的问题是: 将数据“流” /

  • 我试图上传一个图像从本地使用bas64做图像检测。 和一切正常工作在localhost和邮递员。 但部署后,我得到了CROS错误。 我已经在 cors中间件在使用url获取图像时工作正常, 但是当我试图使用bas64从本地上传图像时,控制台显示: 这是我尝试过的解决方案: cors-任何地方 然后显示。 由于在localhost和postman中测试时没有错误,我发现一些文章说这可能仍然是cors

  • 问题内容: 我想先预览图像,然后再将其上传到服务器。我已经为其编写了一些代码,但是由于某种安全原因,它只能在Internet Explorer中预览,而不能在其他浏览器(如Safari,Chrome,Firefox)中预览。有什么解决方案可以在这些浏览器中预览图像吗? 问题答案: 对于Firefox。由于安全原因,它的路径被截断了。但是,他们提供了其他方法: 以下内容适用于Internet Exp

  • 我正在尝试使用webview上传图像。一切正常,如预期的那样,但只有图像没有上传,当照片从相机中点击时。请帮我找到这个。我得到了一些答案,但没有帮助或没有回答,就像这个没有回答一样,这对我没有帮助,这是直接打开画廊,不适用于相机,这个没有帮助我 这是我的活动代码