Dalam proyek JS Angular saya, saya memiliki <a>
jangkar tag, yang ketika diklik membuat GET
permintaan HTTP ke metode WebAPI yang mengembalikan file.
Sekarang, saya ingin file diunduh ke pengguna setelah permintaan berhasil. Bagaimana aku melakukan itu?
Tag jangkar:
<a href="#" ng-click="getthefile()">Download img</a>
AngularJS:
$scope.getthefile = function () {
$http({
method: 'GET',
cache: false,
url: $scope.appPath + 'CourseRegConfirm/getfile',
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
}).success(function (data, status) {
console.log(data); // Displays text data if the file is a text file, binary if it's an image
// What should I write here to download the file I receive from the WebAPI method?
}).error(function (data, status) {
// ...
});
}
Metode WebAPI saya:
[Authorize]
[Route("getfile")]
public HttpResponseMessage GetTestFile()
{
HttpResponseMessage result = null;
var localFilePath = HttpContext.Current.Server.MapPath("~/timetable.jpg");
if (!File.Exists(localFilePath))
{
result = Request.CreateResponse(HttpStatusCode.Gone);
}
else
{
// Serve the file to the client
result = Request.CreateResponse(HttpStatusCode.OK);
result.Content = new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read));
result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = "SampleImg";
}
return result;
}
c#
javascript
html
angularjs
asp.net-web-api
dimanaDragonsDwell
sumber
sumber
Jawaban:
Dukungan untuk mengunduh file biner dalam menggunakan ajax tidak bagus, masih banyak yang sedang dikembangkan sebagai draft yang masih berfungsi .
Metode pengunduhan sederhana:
Anda dapat meminta browser mengunduh file yang diminta hanya dengan menggunakan kode di bawah ini, dan ini didukung di semua browser, dan jelas akan memicu permintaan WebApi sama saja.
Metode pengunduhan biner Ajax:
Menggunakan ajax untuk mengunduh file biner dapat dilakukan di beberapa browser dan di bawah ini merupakan implementasi yang akan bekerja dalam rasa terbaru Chrome, Internet Explorer, FireFox dan Safari.
Ini menggunakan
arraybuffer
jenis respons, yang kemudian dikonversi menjadi JavaScriptblob
, yang kemudian disajikan untuk menyimpan menggunakansaveBlob
metode - meskipun ini hanya saat ini ada di Internet Explorer - atau berubah menjadi gumpalan data URL yang dibuka oleh browser, memicu dialog unduhan jika tipe mime didukung untuk dilihat di browser.Dukungan Internet Explorer 11 (Tetap)
Catatan: Internet Explorer 11 tidak suka menggunakan
msSaveBlob
fungsi jika telah alias - mungkin fitur keamanan, tetapi lebih cenderung cacat, Jadi menggunakanvar saveBlob = navigator.msSaveBlob || navigator.webkitSaveBlob ... etc.
untuk menentukansaveBlob
dukungan yang tersedia menyebabkan pengecualian; karenanya mengapa kode di bawah sekarang menguji secaranavigator.msSaveBlob
terpisah. Terima kasih? MicrosoftPemakaian:
Catatan:
Anda harus memodifikasi metode WebApi Anda untuk mengembalikan header berikut:
Saya telah menggunakan
x-filename
header untuk mengirim nama file. Ini adalah tajuk khusus untuk kenyamanan, namun Anda dapat mengekstrak nama file daricontent-disposition
tajuk menggunakan ekspresi reguler.Anda juga harus mengatur
content-type
header mime untuk respons Anda, sehingga browser mengetahui format data.Saya harap ini membantu.
sumber
window.open
disarankan.C # WebApi unduh PDF semua bekerja dengan Otentikasi Angular JS
Pengontrol Api Web
Layanan JS Angular
Salah satu akan melakukannya
Kontroler JS Angular memanggil layanan
Dan terakhir halaman HTML
Ini akan di-refactored hanya dengan membagikan kode sekarang, harap ini membantu seseorang karena perlu waktu bagi saya untuk membuatnya berfungsi.
sumber
Bagi saya API Web adalah Rails dan sisi klien Angular digunakan dengan Restangular dan FileSaver.js
API web
HTML
Pengontrol sudut
Layanan Angular
sumber
Kami juga harus mengembangkan solusi yang bahkan dapat bekerja dengan API yang memerlukan otentikasi (lihat artikel ini )
Singkatnya, menggunakan AngularJS di sini adalah bagaimana kami melakukannya:
Langkah 1: Buat arahan khusus
Langkah 2: Buat templat
Langkah 3: Gunakan
Ini akan membuat tombol biru. Ketika diklik, PDF akan diunduh (Perhatian: backend harus mengirimkan PDF dalam pengkodean Base64!) Dan dimasukkan ke dalam href. Tombol berubah menjadi hijau dan mengalihkan teks ke Simpan . Pengguna dapat mengklik lagi dan akan disajikan dialog file unduhan standar untuk file my-awesome.pdf .
sumber
Kirim file Anda sebagai string base64.
Jika metode attr tidak berfungsi di Firefox Anda juga dapat menggunakan metode setScript javaAtribut javaScript
sumber
Anda bisa mengimplementasikan fungsi showfile yang mengambil parameter data yang dikembalikan dari WEBApi, dan nama file untuk file yang Anda coba unduh. Apa yang saya lakukan adalah membuat layanan browser yang terpisah mengidentifikasi browser pengguna dan kemudian menangani rendering file berdasarkan browser. Misalnya jika browser target chrome pada ipad, Anda harus menggunakan objek FileReader javascripts.
sumber
Saya telah melalui berbagai solusi dan inilah yang saya temukan telah bekerja sangat baik untuk saya.
Dalam kasus saya, saya perlu mengirim permintaan posting dengan beberapa kredensial. Overhead kecil adalah untuk menambahkan jquery di dalam skrip. Tapi itu sepadan.
sumber
Dalam komponen Anda yaitu kode js sudut:
sumber