Saya memiliki aplikasi WebApi / MVC yang saya kembangkan klien angular2 (untuk menggantikan MVC). Saya mengalami beberapa masalah memahami bagaimana Angular menyimpan file.
Permintaannya ok (berfungsi baik dengan MVC, dan kami dapat mencatat data yang diterima) tapi saya tidak tahu bagaimana cara menyimpan data yang diunduh (saya kebanyakan mengikuti logika yang sama seperti pada posting ini ). Saya yakin itu sangat sederhana, tapi sejauh ini saya tidak mengerti.
Kode fungsi komponen di bawah ini. Saya sudah mencoba berbagai alternatif, cara gumpalan harus menjadi cara untuk pergi sejauh yang saya mengerti, tetapi tidak ada fungsi createObjectURL
di dalamnya URL
. Saya bahkan tidak dapat menemukan definisi URL
di jendela, tetapi ternyata itu ada. Jika saya menggunakan FileSaver.js
modul saya mendapatkan kesalahan yang sama. Jadi saya kira ini adalah sesuatu yang berubah baru-baru ini atau belum diimplementasikan. Bagaimana saya bisa memicu penyimpanan file dalam A2?
downloadfile(type: string){
let thefile = {};
this.pservice.downloadfile(this.rundata.name, type)
.subscribe(data => thefile = new Blob([data], { type: "application/octet-stream" }), //console.log(data),
error => console.log("Error downloading the file."),
() => console.log('Completed file download.'));
let url = window.URL.createObjectURL(thefile);
window.open(url);
}
Demi kelengkapan, layanan yang mengambil data ada di bawah ini, tetapi satu-satunya yang dilakukannya adalah mengeluarkan permintaan dan meneruskan data tanpa memetakan jika berhasil:
downloadfile(runname: string, type: string){
return this.authHttp.get( this.files_api + this.title +"/"+ runname + "/?file="+ type)
.catch(this.logAndPassOn);
}
Jawaban:
Masalahnya adalah bahwa observable berjalan dalam konteks lain, jadi ketika Anda mencoba membuat URL var, Anda memiliki objek kosong dan bukan gumpalan yang Anda inginkan.
Salah satu dari banyak cara yang ada untuk menyelesaikan ini adalah sebagai berikut:
Ketika permintaan sudah siap, ia akan memanggil fungsi "downloadFile" yang didefinisikan sebagai berikut:
gumpalan telah dibuat dengan sempurna dan demikian juga URL var, jika tidak membuka jendela baru, periksa apakah Anda sudah mengimpor 'rxjs / Rx';
Saya harap ini dapat membantu Anda.
sumber
this._reportService.getReport()
dan apa kembalinya?getReport()
return athis.http.get(PriceConf.download.url)
Coba ini !
1 - Instal dependensi untuk pop-up file save / buka file
2- Buat layanan dengan fungsi ini untuk menerima data
3- Pada komponen parsing gumpalan dengan 'file-saver'
Ini bekerja untuk saya!
sumber
Jika Anda tidak perlu menambahkan header dalam permintaan, untuk mengunduh file di Angular2 Anda dapat melakukan yang sederhana :
dalam komponen Anda.
sumber
authHttp
!Ini untuk orang yang mencari cara melakukannya menggunakan HttpClient dan file-saver:
Kelas Layanan API:
Komponen:
sumber
Bagaimana dengan ini?
Saya bisa melakukannya.
tidak perlu paket tambahan.
sumber
Seperti yang disebutkan oleh Alejandro Corredor itu adalah kesalahan ruang lingkup yang sederhana. The
subscribe
dijalankan asynchronously danopen
harus ditempatkan dalam konteks itu, sehingga data selesai memuat ketika kita memicu unduhan.Yang mengatakan, ada dua cara untuk melakukannya. Seperti yang direkomendasikan oleh dokumen, layanan menangani pengambilan dan pemetaan data:
Kemudian, pada komponen kita hanya berlangganan dan berurusan dengan data yang dipetakan. Ada dua kemungkinan. Yang pertama , seperti yang disarankan dalam posting asli, tetapi perlu koreksi kecil seperti dicatat oleh Alejandro:
Cara kedua adalah menggunakan FileReader. Logikanya sama tetapi kita bisa secara eksplisit menunggu FileReader memuat data, menghindari sarang, dan menyelesaikan masalah async.
Catatan: Saya mencoba mengunduh file Excel, dan meskipun unduhannya dipicu (jadi ini menjawab pertanyaan), file tersebut rusak. Lihat jawaban untuk posting ini untuk menghindari file yang rusak.
sumber
res
ke dalam gumpalan dan Anda benar-benar inginres._body
. Namun_body
variabel pribadi dan tidak dapat diakses. Pada hari ini.blob()
dan.arrayBuffer()
pada objek respon http belum diimplementasikan dalam Angular 2.text()
danjson()
merupakan satu-satunya dua pilihan tetapi keduanya akan memutarbalikkan tubuh Anda. Sudahkah Anda menemukan solusinya?<a href=""></a>
untuk mengunduh file.Unduh * .zip solution untuk angular 2.4.x: Anda harus mengimpor ResponseContentType dari '@ angular / http' dan mengubah responseType ke ResponseContentType.ArrayBuffer (secara default, ResponseContentType.Json)
sumber
Untuk versi sudut yang lebih baru:
sumber
Mengunduh file melalui ajax selalu merupakan proses yang menyakitkan dan Dalam pandangan saya yang terbaik adalah membiarkan server dan browser melakukan pekerjaan negosiasi tipe konten ini.
Saya pikir yang terbaik untuk dimiliki
untuk melakukannya. Ini bahkan tidak memerlukan pembukaan jendela baru dan hal-hal seperti itu.
Pengontrol MVC seperti pada sampel Anda dapat seperti di bawah ini:
sumber
Saya menggunakan Angular 4 dengan objek 4.3 httpClient. Saya mengubah jawaban yang saya temukan di Blog Teknis Js 'yang membuat objek tautan, menggunakannya untuk melakukan pengunduhan, kemudian menghancurkannya.
Klien:
Nilai this.downloadUrl telah ditetapkan sebelumnya untuk menunjuk ke api. Saya menggunakan ini untuk mengunduh lampiran, jadi saya tahu id, contentType dan nama file: Saya menggunakan api MVC untuk mengembalikan file:
Kelas lampiran terlihat seperti ini:
Repositori filerep mengembalikan file dari database.
Semoga ini bisa membantu seseorang :)
sumber
Bagi mereka yang menggunakan Pola Redux
Saya menambahkan dalam file-saver sebagai @Hector Cuevas disebutkan dalam jawabannya. Menggunakan Angular2 v. 2.3.1, saya tidak perlu menambahkan @ types / file-saver.
Contoh berikut adalah mengunduh jurnal sebagai PDF.
Tindakan jurnal
Efek jurnal
Layanan jurnal
Layanan HTTP
Peredam jurnal Meskipun ini hanya menetapkan status yang benar yang digunakan dalam aplikasi kita, saya masih ingin menambahkannya untuk menunjukkan pola yang lengkap.
Saya harap ini bermanfaat.
sumber
Saya membagikan solusi yang membantu saya (setiap perbaikan sangat dihargai)
Pada layanan Anda ' layanan ':
Bagian komponen :
Pada bagian komponen, Anda memanggil layanan tanpa berlangganan tanggapan. Berlangganan untuk daftar lengkap tipe mime openOffice lihat: http://www.openoffice.org/framework/documentation/mimetypes/mimetypes.html
sumber
Akan lebih baik jika Anda mencoba memanggil metode baru di dalam diri Anda
subscribe
downloadFile(data)
Fungsi dalam kita perlu buatblock, link, href and file name
sumber
Untuk mengunduh dan menampilkan file PDF , kode yang sangat mirip dipotong seperti di bawah ini:
sumber
Inilah sesuatu yang saya lakukan dalam kasus saya -
Solusinya dirujuk dari - sini
sumber
Perbarui ke jawaban Hector menggunakan file-saver dan HttpClient untuk langkah 2:
sumber
Saya mendapat solusi untuk mengunduh dari angular 2 tanpa menjadi korup, menggunakan spring mvc dan angular 2
1st - tipe pengembalian saya adalah: - ResponseEntity dari java end. Di sini saya mengirim array byte [] memiliki tipe kembali dari controller.
2 - untuk memasukkan fileaver di ruang kerja Anda-di halaman indeks sebagai:
3rd- at ts komponen menulis kode ini:
Ini akan memberi Anda format file xls. Jika Anda ingin format lain, ubah mediatype dan nama file dengan ekstensi yang benar.
sumber
Saya menghadapi kasus yang sama hari ini, saya harus mengunduh file pdf sebagai lampiran (file tidak boleh di-render di browser, tetapi diunduh sebagai gantinya). Untuk mencapai itu saya menemukan saya harus mendapatkan file dalam Angular
Blob
, dan, pada saat yang sama, tambahkan aContent-Disposition
header di respons.Ini adalah yang paling sederhana yang bisa saya dapatkan (Angular 7):
Di dalam layanan:
Kemudian, ketika saya perlu mengunduh file dalam suatu komponen, saya dapat dengan mudah:
MEMPERBARUI:
Menghapus pengaturan tajuk yang tidak perlu dari layanan
sumber
Kode berikut ini berfungsi untuk saya
sumber
Saya menemukan jawabannya sejauh ini kurang wawasan dan juga peringatan. Anda dapat dan harus memperhatikan ketidakcocokan dengan IE10 + (jika Anda peduli).
Ini adalah contoh lengkap dengan bagian aplikasi dan bagian layanan setelahnya. Perhatikan bahwa kita mengatur observ: "response" untuk menangkap header untuk nama file. Perhatikan juga bahwa header Content-Disposition harus diatur dan diekspos oleh server, jika tidak, HttpClient Angular saat ini tidak akan meneruskannya. Saya menambahkan potongan kode inti dotnet untuk itu di bawah ini.
Inti Dotnet, dengan Content-Disposition & MediaType
sumber
sumber
Cukup menempatkan
url
sebagaihref
sebagai berikut.sumber
<a href="my_url" download="myfilename">Download file</a>
my_url harus memiliki asal yang sama, jika tidak maka akan diarahkan ke lokasi itu
sumber
Anda juga dapat mengunduh file langsung dari templat tempat Anda menggunakan atribut unduhan dan
[attr.href]
Anda dapat memberikan nilai properti dari komponen. Solusi sederhana ini dapat digunakan di sebagian besar browser.Referensi: https://www.w3schools.com/tags/att_a_download.asp
sumber
Jika Anda hanya mengirim parameter ke URL, Anda bisa melakukannya dengan cara ini:
dalam layanan yang menerima parameter
sumber
IniJawaban menunjukkan bahwa Anda tidak dapat mengunduh file secara langsung dengan AJAX, terutama karena alasan keamanan. Jadi saya akan menjelaskan apa yang saya lakukan dalam situasi ini,
01. Tambahkan
href
atribut di tag jangkar Anda di dalamcomponent.html
file,misalnya: -
02. Lakukan semua langkah berikut di dalam Anda
component.ts
untuk memintas tingkat keamanan dan bawa dialog save as popup,mis: -
sumber
Yah, saya menulis sepotong kode yang terinspirasi oleh banyak jawaban di atas yang seharusnya dapat dengan mudah bekerja di sebagian besar skenario di mana server mengirim file dengan header disposisi konten, tanpa instalasi pihak ketiga, kecuali rxjs dan angular.
Pertama, cara memanggil kode dari file komponen Anda
Seperti yang Anda lihat, itu pada dasarnya cukup banyak panggilan backend rata-rata dari sudut, dengan dua perubahan
Setelah file diambil dari server, saya pada prinsipnya, mendelegasikan seluruh tugas menyimpan file ke fungsi helper, yang saya simpan di file terpisah, dan impor ke komponen mana pun yang saya butuhkan.
Di sana, tidak ada lagi nama file GUID samar! Kita dapat menggunakan nama apa pun yang disediakan server, tanpa harus menentukannya secara eksplisit di klien, atau, menimpa nama file yang disediakan oleh server (seperti dalam contoh ini). Juga, orang dapat dengan mudah, jika perlu, mengubah algoritma mengekstraksi nama file dari disposisi konten agar sesuai dengan kebutuhan mereka, dan segala sesuatu yang lain akan tetap tidak terpengaruh - jika terjadi kesalahan selama ekstraksi seperti itu, itu hanya akan melewati 'nol' sebagai nama file.
Seperti jawaban lain yang sudah ditunjukkan, IE memerlukan beberapa perlakuan khusus, seperti biasa. Tetapi dengan kromium yang akan datang dalam beberapa bulan, saya tidak akan khawatir tentang hal itu sambil membangun aplikasi baru (mudah-mudahan). Ada juga masalah mencabut URL, tapi saya agak tidak begitu yakin tentang itu, jadi jika seseorang bisa membantu dengan itu di komentar, itu akan luar biasa.
sumber
Jika sebuah tab membuka dan menutup tanpa mengunduh apa pun, saya mencoba mengikuti dengan tautan mock anchor dan itu berhasil.
sumber