2015-04-21 9 views
17

W moim kontroler nazywam usługę, która zwraca obietnicę

var onComplete = function(data) { 
       $scope.myImage = data;   
      }; 

W mojej służbie nawiązywać połączenia, aby uzyskać obraz przekazując link bezpośrednio do obrazka się do:

return $http.get("http://someurl.com/someimagepath") 
     .then(function(response){   
      return response.data; 
     }); 

Wszystkie rozmowy udaje i response.data wydaje się trzymając w obrazie wewnątrz:

����JFIF��;CREATOR: gd-jpeg v1.0 (using IJG JPEG v80), quality = 90 
��C 




��C  

����"�� 
���}!1AQa"q2���#B��R��$ 

, chociaż nie jestem pewien, czy tak, ponieważ mam problem z wyświetlaniem go. Próbowałem (wewnątrz index.html)

<img ng-src="{{myImage}}"> 
    and 
<img ng-src="{{myImage}}.jpeg"> 
    and 
<img ng-src="data:image/JPEG;base64,{{myImage}}"> 

Pomysły? Czy można zwrócić rzeczywisty obraz z $ http.get i przekonwertować jego odpowiedź z powrotem na obraz (jpeg itp.)

Dzięki!

+0

Na podstawie moich eksperymentów z próbując wprowadzać obrazy do tagów, aby zmniejszyć liczbę żądań HTTP dla tworzonej przez siebie jednostronnej aplikacji, nie, nie jest to możliwe. – RevanProdigalKnight

+1

Jaki jest ostateczny cel tutaj? Jeśli znasz 'http: // someurl.com/someimagepath', dlaczego musisz pobrać go za pomocą' $ http.get() ', a następnie wstawić go do znacznika' src', kiedy możesz pominąć środkowego mężczyznę i po prostu umieść ścieżkę w tagu 'src'? – Tom

+1

@Tom - to był tylko test do pobierania niektórych danych asynchronicznie i pomyślałem o odzyskaniu z nim obrazu. Nie ma prawdziwego celu końcowego poza uczeniem się AngularJS – ra170

Odpowiedz

6

Obraz, który powraca, jest w wersji binary encoding, a nie w wersji Base64.

Zrozumiałe, że tagi nie wspierają pozyskiwania z binarnego poprzez atrybuty, więc będziesz musiał spojrzeć na inne rozwiązanie.

Możesz spróbować przekonwertować kodowanie binarne na Base64 po stronie klienta, używając TypedArrays wraz z funkcją btoa. Wtedy można użyć

<img ng-src="data:image/JPEG;base64,{{myImage}}"> 

This guide uboczny Mozilla obejmuje złożenie wniosku XHR na obraz i czytania i go bezpośrednio do UInt8Array. To powinno być dobre miejsce wyjściowe.

Jest napisany dla zwykłego starego Javascript, ale przetłumaczenie go na Angular powinno być dobrym ćwiczeniem, jeśli dopiero się uczysz lin.

+0

Dzięki, wygląda jak ciąg binarny. Sprawdzę przewodniki! – ra170

+1

@ ra170 Czy możesz napisać kod, jeśli zdołasz go rozwiązać? – Tometoyou

+0

@ Tometoyou znalazłem rozwiązanie, przechodząc dookoła ** arraybuffer do base64 **: http://stackoverflow.com/questions/6965107/converting-between-strings-and-arraybuffers – paradite

15

Na wszelki wypadek, gdy ktoś tego potrzebuje.

W moim przypadku musiałem wysłać wniosek za pośrednictwem usługi kątowej $http, z powodu różnych transformatorów i innych fantazyjnych rzeczy, które z nią robimy.

Więc na podstawie Mozilla's guide wspomniano wcześniej, wymyśliłem następujące rozwiązanie:

let getImageDataURL = (url, imageType = 'image/jpeg') => { 
    return $http.get(url, {responseType: 'arraybuffer'}).then((res) => { 
    let blob = new Blob([res.data], {type: imageType}); 
    return (window.URL || window.webkitURL).createObjectURL(blob); 
    }); 
}; 

Podstawowym założeniem jest, aby ustawić właściwość responseType bazowego życzenie użyciem nagłówków XHR i przekonwertować binarny treści do adresu danych .

19

Żadna z metod wydaje się być kompletny, to kompletne rozwiązanie:

$http({ 
    method: 'GET', 
    url: imageUrl, 
    responseType: 'arraybuffer' 
    }).then(function(response) { 
    console.log(response); 
    var str = _arrayBufferToBase64(response.data); 
    console.log(str); 
    // str is base64 encoded. 
    }, function(response) { 
    console.error('error in getting static img.'); 
    }); 


    function _arrayBufferToBase64(buffer) { 
    var binary = ''; 
    var bytes = new Uint8Array(buffer); 
    var len = bytes.byteLength; 
    for (var i = 0; i < len; i++) { 
     binary += String.fromCharCode(bytes[i]); 
    } 
    return window.btoa(binary); 
    } 

Wtedy jestem w stanie użyć go bezpośrednio:

<img data-ng-src="data:image/png;base64,{{img}}"> 

funkcji do konwertowania arraybuffer w base64 pochodzi bezpośrednio z ArrayBuffer to base64 encoded string

+0

To działa jak urok! – vinitius

+0

Scenariusz tego wpisu ściśle odpowiada mojej sytuacji. Podoba mi się potencjał tego rozwiązania, ale niestety nie podoba mi się struktura lub format danych binarnych (tablicy bajtów), które są przekazywane z powrotem przez usługę $ http Angular. Uint8Array wraca pusta, gdy próbuje utworzyć tablicę bajtów. Wezwę moje rozwiązanie, gdy tylko zauważę różnicę. –

+0

Uratowałeś mi dzień .. !! Dziękuję Ci. @paradite mogę wiedzieć, jak odzyskać listę obrazów i wyświetlać – Hema

Powiązane problemy