2012-01-17 55 views
2

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

问题是,我无法从服务器进行web服务调用,因为web服务应用程序在每个用户机器上运行,并且请求的服务为http://localhost/get_image,该服务返回图像。

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

+0

BASE64编码它,POST到服务器并保存在那里。 – 2012-01-17 10:56:39

+0

我正在尝试的是 $ .ajax({url:'http:// localhost:8080/image',success:function(msg){$('#some_field').val(Base64.encode(msg) ); $('#nuser')。submit();}}); 但系统在线上挂起Base64.encode – rrd 2012-01-17 11:06:17

+0

Base64可能未定义(它不是核心JS对象)。尝试下载一个JavaScript base64编码库(http://code.google.nl/)。com/p/stringencoders/source/browse/trunk/javascript/base64.js?r = 210) – 2012-01-17 12:16:37

回答

4

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

  1. 与以下html元素
    • 画布元件创建的一种形式:获取图像
    • 文本区:存储基部64编码的响应,并发送响应于服务器
  2. 确保webservice响应头包含允许跨源资源共享的“Access-Control-Allow-Origin:*”

  3. jQuery代码

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” 红宝石库
File.open('test.png',"wb") do |file| 
    file.write(Base64.decode64(params[:text_area])) 
end 
+0

感谢Surbhi的完美运行 – rrd 2012-01-19 04:54:40

+0

确保您的浏览器支持HTML5。您可以通过http://html5test.com/进行测试 – crazycrv 2012-01-19 06:43:56

0

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

你可以试试这里的Javascript base64编码解码http://rumkin.com/tools/compression/base64.php

此外,请确保您使用file.write和file.read代替file.puts和file.gets当你尝试写PNG图像文件

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

尽管最好的解决方案是将图像URL作为Web服务响应返回,并从资产服务器获取图像。