10

I have a server side application that will return an image. These are the response headers:

Content-Disposition: attachment; filename=8822a009-944e-43f4-999b-d297198d302a;1.0_low-res
Content-Length: 502343
Content-Type: image/png
Date: Mon, 03 Aug 2015 19:13:39 GMT
Server: Apache-Coyote/1.1

In angular, I need to display the image. When getting the image, I use the angularJS $http to call the server and put the result in scope, but I never reach the success function of $http. Executing this call from postman returns the image normally. I'm curious to how to get Angular to display the image.

This is how I display the image:

<img ng-src={{image}} />

Here is the call to get the image from the server:

$http.get(url, {responseType: "arraybuffer"})
    .success(function(data) {
        $scope.image= data;
    }
)
2
  • Can you post the $http call to the server? Commented Aug 3, 2015 at 19:45
  • Yup, here it is: ` $http.get(url, {responseType: "arraybuffer"} ). success(function(data) { $scope.image= data; }) ` Commented Aug 3, 2015 at 19:47

3 Answers 3

11

I agree with Bellu's response in that you should be using the .then function, rather than the .success function on the promise returned from the $http.get. However, I'd imagine you'll still have an issue with your ng-src reference in that you are not supplying it with a URL, but instead a reference to your byte array.

To bind your ng-src reference to a byte array held in memory on the client, your binding should take the following form:

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

Edit

Since I never mentioned it explicitly, the ng-src binding above assumes that your image data is in base64 format. HarrisonA provided a method below to convert the array if it isn't already in base64 format.

Sign up to request clarification or add additional context in comments.

11 Comments

Thank you guys for the responses, i have made progress using the code Bellu posted, i am just struggling with the display of the image. Debugging the code i have the image in the response with a certain size but the image is still not displayed in the UI. Am i missing something?
Figured it out. We had to encode the arrayBuffer into the base64 string. All good now :) Thank you guys for answers!
Just coming back around to this from yesterday. Glad you got it working! For what it's worth, base64 probably isn't the only format that will work, it's just the most common example. You can read up further on formats for data URI schemes here: en.wikipedia.org/wiki/Data_URI_scheme#Format
Will do! Thanks for the help!
How can I display the same thing in option of select using angular js?
|
9

Just wanted to add to jdmcnair answer and Loshmeey's comment:

Below is a link to the function that I used to convert the array buffer into a base 64 string.

ArrayBuffer to base64 encoded string

The function:

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 );
}

I used this function in my angular controller and then passed the result (using a $scope variable) to the img element in my html file.

1 Comment

+1 Because the original question is about a byte array and not yet a Base64 encoded string. Your snippet was the missing bit to plug it all together.
2
  • I think that you should use then callback, in the angular documentation they say that the success callback has been deprecated.
  • Your img is in the data response property.

After these considerations, you could try something like this.

$http.get(url, {responseType: "arraybuffer"} ).then(function(response) { 
$scope.image= response.data; });

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.