Как сохранить изображение, возвращенное веб-сервисом? - PullRequest
2 голосов
/ 17 января 2012

У меня есть вызов веб-службы, который возвращает изображение, теперь я хочу сохранить это изображение в файловой системе на сервере.

Проблема в том, что я не могу выполнить вызов веб-службы с сервера, так какПриложение webservice запускается на каждом пользовательском компьютере, и в службу поступает запрос http://localhost/get_image, который возвращает изображение.

Как сохранить это изображение на сервере?

Ответы [ 3 ]

4 голосов
/ 19 января 2012

Вы можете использовать HTML5 для загрузки изображения с использованием javascript и отправки ответа в кодировке base64 на сервер, где вы можете декодировать ответ и записать изображение в файл. Вот подход

  1. Создать форму со следующими html-элементами
    • элемент canvas: для получения изображения
    • текстовая область: для хранения ответа в кодировке base 64 и отправки ответа на сервер
  2. Убедитесь, что заголовки ответов веб-службы имеют «Access-Control-Allow-Origin: *», чтобы разрешить совместное использование ресурсов между источниками

  3. Код запроса

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. Сторона сервера - Расшифруйте ответ, используя библиотеку ruby ​​"base64"
File.open('test.png',"wb") do |file|
  file.write(Base64.decode64(params[:text_area]))
end
0 голосов
/ 17 января 2012

Как указано выше, при передаче изображения по проводам следует использовать кодировку 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-адреса изображения в качестве ответа веб-службы и получение изображения с сервера ресурсов.

0 голосов
/ 17 января 2012

Для загрузки изображений URL я предпочитаю использовать carrierwave gem

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

...