Paperclip和xhr.sendAsBinary

我使用paperclip将文件添加到我的模型中。

我想使用firefox 3.6的新functionxhr.sendAsBinary来发送带有ajax请求的文件。

以下是我构建请求的方式:

 var xhr = new XMLHttpRequest(); xhr.open("POST", "/photos?authenticity_token=" + token + "&photo[name]=" + img.name + "&photo[size]=" + img.size); xhr.overrideMimeType('text/plain; charset=x-user-defined-binary'); xhr.sendAsBinary(bin); 

namesize保存在我的模型中没有问题,但文件本身不会被回形针捕获。

我的模特

 class Photo  { :medium => "300x300>", :thumb => "100x100>" } end 

迁移

 def self.up add_column :photos, :photo_file_name, :string add_column :photos, :photo_content_type, :string add_column :photos, :photo_file_size, :integer add_column :photos, :photo_updated_at, :datetime end 

和我的控制器

  # POST /photos # POST /photos.xml def create @photo = Photo.new(params[:photo]) respond_to do |format| if @photo.save format.html { redirect_to(@photo, :notice => 'Photo was successfully created.') } format.xml { render :xml => @photo, :status => :created, :location => @photo } else format.html { render :action => "new" } format.xml { render :xml => @photo.errors, :status => :unprocessable_entity } end end end 

知道如何解决这个问题吗?

谢谢

我终于成功了!

我的javascript发送文件看起来像这样

  send : function() { try { var xhr = new XMLHttpRequest; //var url = this.form.action; var url = '/photos'; var boundary = this.generateBoundary(); var contentType = "multipart/form-data; boundary=" + boundary; this.filesToUpload.forEach(function(file, index, all) { xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", contentType); for (var header in this.headers) { xhr.setRequestHeader(header, headers[header]); } var CRLF = "\r\n"; var request = "--" + boundary + CRLF; request += 'Content-Disposition: form-data; '; request += 'name="' + 'photo[name]' + '"' + CRLF + CRLF; request += file.name + CRLF; request += "--" + boundary + CRLF; request += 'Content-Disposition: form-data; '; request += 'name="' + 'photo[photo]' + '"; '; request += 'filename="'+ file.fileName + '"' + CRLF; request += "Content-Type: application/octet-stream" + CRLF + CRLF; request += file.value + CRLF; request+= "--" + boundary + "--" + CRLF; xhr.sendAsBinary(request); }); // finally send the request as binary data //xhr.sendAsBinary(this.buildMessage(this.filesToUpload, boundary)); } catch(e) { alert('send Error: ' + e); } } 

现在,Paperclip将文件作为普通input file