代码之家  ›  专栏  ›  技术社区  ›  denisjacquemin

回形针和xhr.sendasbinary

  •  6
  • denisjacquemin  · 技术社区  · 16 年前

    我用回形针给我的模型添加一个文件。

    我想使用火狐3.6的新功能, xhr.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);
    

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

    我的模型

    class Photo < ActiveRecord::Base
      has_attached_file :photo, :styles => { :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
    

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

    谢谢

    1 回复  |  直到 10 年前
        1
  •  4
  •   davegson    10 年前

     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);
         }
     }
    

    input file