Base64从Android/Java上传到RoR Carrierwave

Base64从Android/Java上传到RoR Carrierwave,java,android,ruby-on-rails-3,base64,carrierwave,Java,Android,Ruby On Rails 3,Base64,Carrierwave,我添加了来自的解决方案,以便从java类上载图像。这就是我的FileUploader类现在的样子——我相信这就是问题所在: # encoding: utf-8 class FileUploader < CarrierWave::Uploader::Base # Include RMagick or MiniMagick support: include CarrierWave::RMagick # include CarrierWave::MiniMagick #

我添加了来自的解决方案,以便从java类上载图像。这就是我的FileUploader类现在的样子——我相信这就是问题所在:

# encoding: utf-8

class FileUploader < CarrierWave::Uploader::Base

  # Include RMagick or MiniMagick support:
    include CarrierWave::RMagick
  # include CarrierWave::MiniMagick

  # Choose what kind of storage to use for this uploader:
  storage :file
  # storage :fog

  #START FROM BASE64 POST LINKED ABOVE
  class FilelessIO < StringIO
    attr_accessor :original_filename
    attr_accessor :content_type
  end

  before :cache, :convert_base64

  def convert_base64(file)
    if file.respond_to?(:original_filename) &&
        file.original_filename.match(/^base64:/)
      fname = file.original_filename.gsub(/^base64:/, '')
      ctype = file.content_type
      decoded = Base64.decode64(file.read)
      file.file.tempfile.close!
      decoded = FilelessIO.new(decoded)
      decoded.original_filename = fname
      decoded.content_type = ctype
      file.__send__ :file=, decoded
    end
    file
  end
#END FROM POST LINKED ABOVE


  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{model.user_id}"
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
  # def default_url
  #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  # end

  # Process files as they are uploaded:
  # process :scale => [200, 300]
  #
  # def scale(width, height)
  #   # do something
  # end

  # Create different versions of your uploaded files:
    version :thumb do
      process :resize_to_fit  => [200, 300]
    end

    version :web do
      process :resize_to_fit  => [1000, 1000]
    end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
   def extension_white_list
     %w(jpg jpeg gif png)
   end

  # Override the filename of the uploaded files:
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
   def filename
     if original_filename
     Time.new.to_i.to_s+"_"+original_filename
     end
   end

end
编码:utf-8 类FileUploader[200300] # #def刻度(宽度、高度) #做点什么 #结束 #创建上载文件的不同版本: 版本:thumb do 过程:调整_的大小以适应=>[200300] 结束 版本:webdo 过程:调整_的大小以适应=>[10001000] 结束 #添加允许上载的扩展的白名单。 #对于图像,您可以使用以下内容: def扩展白名单 %w(jpg jpeg gif png) 结束 #覆盖上载文件的文件名: #避免在此处使用model.id或version\u名称,有关详细信息,请参阅uploader/store.rb。 def文件名 如果是原始文件名 Time.new.to_i.to_s+“_”+原始文件名 结束 结束 结束 图片模型:

class Picture < ActiveRecord::Base

  belongs_to :user
  belongs_to :folders

  attr_accessible :user_id, :picture_name, :picture_description,
    :folder_id, :picture_path, :file_save

  mount_uploader :picture_path, FileUploader

   before_save :update_pictures_attributes

  def update_pictures_attributes
      self.file_size = picture_path.file.size
  end

end
类图片
现在,当进行Post调用时,保存在db中的文件路径是nil——但其他所有内容都保存了。以下是java/android类:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.client.*;
import org.apache.http.client.entity.*;
import org.apache.http.client.methods.*;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.*;
import org.apache.http.message.*;
import org.apache.commons.io.FileUtils;
import org.json.*;
import android.util.Base64;
import android.util.Log;

public class Uploader {

    private String url;
    private String fileName;

    public Uploader(String url, String fileName){
        this.url = url;
        this.fileName = fileName;
    }

    public Boolean upload() throws JSONException, ClientProtocolException, IOException {
        Boolean success = true;
        JSONObject jsonObject = constructPictureJson();
            DefaultHttpClient httpClient = new DefaultHttpClient();

            ResponseHandler <String> responseHandler = new BasicResponseHandler();
            HttpPost postMethod = new HttpPost(url);
            postMethod.setEntity(new StringEntity(jsonObject.toString()));
            postMethod.setHeader("Accept", "application/json");
            postMethod.setHeader("Content-type", "application/json");
            postMethod.setHeader("Data-type", "json");
            try{
            httpClient.execute(postMethod, responseHandler);
            } catch (org.apache.http.client.HttpResponseException error){
                Log.d("Uploader Class Error", "Error code: "+error.getStatusCode());
                Log.d("Uploader Class Error", "Error message: "+error.getMessage());
                success = false;
            }
            //Log.d("server resposne", response);
            return success;
    }

    public JSONObject constructPictureJson() throws JSONException, IOException{
        String userId = "1"; 
        String folderId = "1";
        String[] file = fileName.split("/");
        JSONObject pictureData = new JSONObject();
        pictureData.put("user_id", userId);
        pictureData.put("folder_id", folderId); 
        pictureData.put("picture_name", "picture name");
        pictureData.put("picture_description", "1"); 
        pictureData.put("content_type", "jpg");
        pictureData.put("original_filename", "base64:"+file[file.length-1]);
        pictureData.put("filename", file[file.length-1]);
        pictureData.put("picture_path", encodePicture(fileName));

        return pictureData;
    }

    public String encodePicture(String fileName) throws IOException{
        File picture = new File(fileName);
        return Base64.encodeToString(FileUtils.readFileToByteArray(picture), Base64.DEFAULT);
    }

}
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入org.apache.http.client.*;
导入org.apache.http.client.entity.*;
导入org.apache.http.client.methods.*;
导入org.apache.http.entity.StringEntity;
导入org.apache.http.impl.client.*;
导入org.apache.http.message.*;
导入org.apache.commons.io.FileUtils;
导入org.json.*;
导入android.util.Base64;
导入android.util.Log;
公共类上传器{
私有字符串url;
私有字符串文件名;
公共上载程序(字符串url、字符串文件名){
this.url=url;
this.fileName=文件名;
}
public Boolean upload()抛出JSONException、ClientProtocolException、IOException{
布尔成功=真;
JSONObject JSONObject=constructPictureJson();
DefaultHttpClient httpClient=新的DefaultHttpClient();
ResponseHandler ResponseHandler=新BasicResponseHandler();
HttpPost postMethod=新的HttpPost(url);
setEntity(新的StringEntity(jsonObject.toString());
setHeader(“接受”、“应用程序/json”);
setHeader(“内容类型”、“应用程序/json”);
setHeader(“数据类型”、“json”);
试一试{
httpClient.execute(postMethod,responseHandler);
}catch(org.apache.http.client.HttpResponseException错误){
d(“上传程序类错误”,“错误代码:+Error.getStatusCode());
d(“上传程序类错误”,“错误消息:+Error.getMessage());
成功=错误;
}
//Log.d(“服务器响应”,响应);
回归成功;
}
公共JSONObject constructPictureJson()抛出JSONException,IOException{
字符串userId=“1”;
字符串folderId=“1”;
String[]file=fileName.split(“/”);
JSONObject pictureData=新的JSONObject();
pictureData.put(“用户id”,userId);
pictureData.put(“文件夹id”,folderId);
pictureData.put(“图片名称”、“图片名称”);
pictureData.put(“picture_description”,“1”);
pictureData.put(“内容类型”、“jpg”);
pictureData.put(“原始文件名”,“base64:+文件[file.length-1]);
pictureData.put(“文件名”,文件[file.length-1]);
pictureData.put(“picture_path”,encodePicture(fileName));
返回图片数据;
}
公共字符串编码图片(字符串文件名)引发IOException{
文件图片=新文件(文件名);
返回Base64.encodeToString(FileUtils.readFileToByteArray(图片),Base64.DEFAULT);
}
}

有人有什么想法吗?我整天都在忙这个。我想,因为我对Ruby了解不多,我要么(1)请求错误;或者(2)我用Carrierwave错误地实现了base64映像

终于解决了这个问题!我希望这个答案能帮助其他试图解决这个问题的人,因为没有好的资源来解决这个问题。这是令人惊讶的,因为我认为其他人会想这样做
picture {:user_id => "1", :folder_id => 1, etc., :picture_path {:file => "base64 awesomeness", :original_filename => "my file name", :filename => "my file name"}}
40        # POST /pictures
41    # POST /pictures.json
42    def create
43  
44      #check if file is within picture_path
45      if params[:picture][:picture_path]["file"]
46           picture_path_params = params[:picture][:picture_path]
47           #create a new tempfile named fileupload
48           tempfile = Tempfile.new("fileupload")
49           tempfile.binmode
50           #get the file and decode it with base64 then write it to the tempfile
51           tempfile.write(Base64.decode64(picture_path_params["file"]))
52     
53           #create a new uploaded file
54           uploaded_file = ActionDispatch::Http::UploadedFile.new(:tempfile => tempfile, :filename => picture_path_params["filename"], :original_filename => picture_path_params["original_filename"]) 
55     
56           #replace picture_path with the new uploaded file
57           params[:picture][:picture_path] =  uploaded_file
58     
59      end
60  
61      @picture = Picture.new(params[:picture])
62  
63      respond_to do |format|
64        if @picture.save
65          format.html { redirect_to @picture, notice: 'Picture was successfully created.' }
66          format.json { render json: @picture, status: :created, location: @picture }
67        else
68          format.html { render action: "new" }
69          format.json { render json: @picture.errors, status: :unprocessable_entity }
70        end
71      end
72    end