如何保存Web服务返回的图像?

时间:2012-01-17 10:55:31

标签: ruby-on-rails ruby ruby-on-rails-3.1 image-uploading

我有一个将返回图像的webservice调用,现在我想将此图像保存到服务器中的文件系统。

问题是,我无法从服务器进行webservice调用,因为webservice应用程序在每台用户计算机上运行,​​并且以http://localhost/get_image的形式向服务发出请求,返回图像。

如何在服务器上保存此图像?

3 个答案:

答案 0 :(得分:4)

您可以使用HTML5使用javascript加载图像,并将base64编码的响应发送到服务器,您可以在其中解码响应并将图像写入文件。这是方法

  1. 使用以下html元素创建表单
    • canvas元素:获取图片
    • 文本区域:存储base 64编码的响应并将响应发送到服务器
  2. 确保webservice响应标头具有“Access-Control-Allow-Origin:*”以允许跨源资源共享

  3. Jquery代码

  4. var myCanvas = document.getElementById('canvasId');    
    var ctx = myCanvas.getContext('2d');    
    var img = new Image;    
    img.crossOrigin = 'anonymous';    
    img.src = "web service url which returns image";    
    img.onload = function(){
      console.log( img.width, img.height );
      // set canvas height and width to image height and width else only part of image will get created
      myCanvas.height = img.height;    
      myCanvas.width = img.width;    
      ctx.drawImage(img,0,0); // Or at whatever offset you like    
      var dataURL = myCanvas.toDataURL("image/png");    
      dataURL = dataURL.replace(/^data:image\/(png|jpg);base64,/, "");    
      $('#some_text_area_id').val(dataURL); // set the response in text area    
      $('#form_id').submit();   // submit the form
    };
    
    1. 服务器端 - 使用“base64”ruby库
    2. 解码响应
      File.open('test.png',"wb") do |file|
        file.write(Base64.decode64(params[:text_area]))
      end
      

答案 1 :(得分:0)

我更喜欢使用carrierwave gem进行网址上传

http://railscasts.com/episodes/253-carrierwave-file-uploads?autoplay=true

答案 2 :(得分:0)

如上所述,在通过网络传输图像时应使用base64编码。 Base64表示ASCII字符串格式的二进制数据。它专门用于MIME内容传输编码和以XML格式存储复杂数据。

您可以在http://rumkin.com/tools/compression/base64.php

尝试Javascript base64编码解码

此外,当您尝试编写png图像文件时,请确保使用file.write和file.read而不是file.puts和file.gets

File.open('a.png', 'rb') do |infile|
   File.open('b.png', 'wb') do |outfile|
      outfile.write(infile.read)
   end  
end

虽然最佳解决方案是将图片URL作为Web服务响应返回,然后从资产服务器获取图像。