Sunday, June 2, 2024
 Popular · Latest · Hot · Upcoming
21
rated 0 times [  28] [ 7]  / answers: 1 / hits: 23775  / 8 Years ago, wed, april 27, 2016, 12:00:00

I have WebAPI method which returns HttpResponseMessage with .csv file as Content:



private static HttpResponseMessage FileAsAttachment(string file)
{
var now = DateTime.Now;
var result = new HttpResponseMessage(HttpStatusCode.OK);

result.Content = new StringContent(file);
result.Content.Headers.ContentType = new MediaTypeHeaderValue(application/octet-stream);
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue(attachment); //attachment will force download
result.Content.Headers.ContentDisposition.FileName = string.Format(Report-{0}.csv, now.ToString(MMMM));

return result;
}


So I have just click function, which make call to server :



$scope.GenerateReport = function() {
var endDate = '2016-04-30';
UserDaysSummary.generateReport({endDate: endDate }, function (result) {
console.log(Export);
});
}


But all that I've got - is a response with data inside.
I've tried to get it as file using this and this answer, but this doesn't change anything.



Preferably, that call to the server has GET method, btw


More From » angularjs

 Answers
4

Is your GenerateReport function returning a promise? Try this:



userDaysSummary.generateReport = function(endDate) {
var defer = $q.defer();

$http.get('path/to/api', { endDate: endDate }, { responseType: 'arrayBuffer' }).then(function(data, status, headers, config) {
var results = {
data: data, //your file is here
headers: headers(), //headers are here
status: status,
config: config
};

//return a success promise containing the response object
defer.resolve(results);

}, function(data, status, headers, config) {
defer.reject(data);
});

return defer.promise;
}


Then, using the promise to download the file:



userDaysSummary.generateReport(endDate).then(function(response) {
//get the file
var octetStreamMime = 'application/octet-stream';

//get the headers' content disposition
var cd = response.headers[content-disposition];

//get the file name with regex
var regex = /filename[^;=n]*=(([']).*?2|[^;n]*)/;
var match = regex.exec(cd);

//is there a fiel name?
var fileName = match[1] || myDefaultFileName.csv;

//replace leading and trailing slashes that C# added to your file name
fileName = fileName.replace(//g, );

//determine the content type from the header or default to octect stream
var contentType = response.headers[content-type] || octetStreamMime;

//finally, download it
try {
var blob = new Blob([response.data], {type: contentType});

//downloading the file depends on the browser
//IE handles it differently than chrome/webkit
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(blob, fileName);
} else {
var objectUrl = URL.createObjectURL(blob);
window.open(objectUrl);
}
} catch (exc) {
console.log(Save Blob method failed with the following exception.);
console.log(exc);
}

}, function(error) {
//an error occurred while trying the API, handle this
});

[#62381] Monday, April 25, 2016, 8 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
marinalyssak

Total Points: 637
Total Questions: 101
Total Answers: 94

Location: Morocco
Member since Fri, May 22, 2020
4 Years ago
;