Saya telah mencoba menerapkan kembali pengunggah gambar HTML5 seperti yang ada di situs Mozilla Hacks , tetapi itu bekerja dengan browser WebKit. Bagian dari tugas adalah untuk mengekstrak file gambar dari canvas
objek dan menambahkannya ke objek FormData untuk diunggah.
Masalahnya adalah bahwa sementara canvas
memiliki toDataURL
fungsi untuk mengembalikan representasi file gambar, objek FormData hanya menerima objek File atau Blob dari File API .
Solusi Mozilla menggunakan fungsi khusus Firefox berikut ini pada canvas
:
var file = canvas.mozGetAsFile("foo.png");
... yang tidak tersedia di browser WebKit. Solusi terbaik yang dapat saya pikirkan adalah menemukan beberapa cara untuk mengubah URI Data menjadi objek File, yang saya pikir mungkin menjadi bagian dari File API, tetapi saya tidak dapat seumur hidup menemukan sesuatu untuk melakukan itu.
Apa itu mungkin? Jika tidak, ada alternatif lain?
Terima kasih.
sumber
Jawaban:
Setelah bermain-main dengan beberapa hal, saya berhasil mencari tahu sendiri.
Pertama-tama, ini akan mengubah dataURI menjadi gumpalan:
Dari sana, menambahkan data ke formulir sedemikian rupa sehingga mudah diunggah sebagai file:
sumber
POST
atauPUT
ke S3?ArrayBuffer
, yang kemudian ditulis keBlobBuilder
instance.var file = new File( [blob], 'canvasImage.jpg', { type: 'image/jpeg' } ); fd.append("canvasImage", file);
BlobBuilder dan ArrayBuffer sekarang tidak digunakan lagi, berikut ini adalah kode komentar teratas yang diperbarui dengan konstruktor Blob:
sumber
array=[]; array.length=binary.length;
...array[i]=bina
... dll. Jadi array sudah dialokasikan sebelumnya. Menghemat push () harus memperpanjang array setiap iterasi, dan kami sedang memproses jutaan item (= byte) di sini, jadi itu penting.Yang ini berfungsi di iOS dan Safari.
Anda perlu menggunakan solusi ArrayBuffer Stoive tetapi Anda tidak dapat menggunakan BlobBuilder, seperti yang ditunjukkan oleh vava720, jadi inilah gabungan keduanya.
sumber
Firefox memiliki metode canvas.toBlob () dan canvas.mozGetAsFile () .
Tetapi browser lain tidak.
Kita bisa mendapatkan dataurl dari kanvas dan kemudian mengkonversi dataurl ke objek gumpalan.
Inilah
dataURLtoBlob()
fungsi saya . Ini sangat singkat.Gunakan fungsi ini dengan FormData untuk menangani kanvas atau dataurl Anda.
Sebagai contoh:
Anda juga dapat membuat
HTMLCanvasElement.prototype.toBlob
metode untuk browser engine non gecko.Sekarang
canvas.toBlob()
berfungsi untuk semua browser modern, tidak hanya Firefox. Sebagai contoh:sumber
Cara pilihan saya adalah canvas.toBlob ()
Namun bagaimanapun juga di sini adalah cara lain untuk mengubah base64 menjadi gumpalan menggunakan fetch ^^,
sumber
XMLHttpRequest
karena url data hanyalah url, Anda dapat menggunakan ajax untuk mengambil sumber daya itu dan Anda memiliki opsi sendiri untuk memutuskan apakah Anda menginginkannya sebagai gumpalan, arraybuffer atau teksblob:
dandata:
tidak didukung secara universal oleh semua implementasi pengambilan. Kami menggunakan pendekatan ini, karena kami tahu kami hanya akan berurusan dengan peramban seluler (WebKit), tetapi Edge misalnya, tidak mendukungnya: developer.mozilla.org/en-US/docs/Web/API/…Berkat @Stoive dan @ vava720 saya menggabungkan keduanya dengan cara ini, menghindari menggunakan BlobBuilder dan ArrayBuffer yang sudah usang.
sumber
Standar yang berkembang tampaknya kanvas.toBlob () bukan canvas.getAsFile () seperti yang bisa ditebak oleh Mozilla.
Saya belum melihat browser yang mendukungnya :(
Terima kasih untuk utas yang luar biasa ini!
Juga, siapa pun yang mencoba jawaban yang diterima harus berhati-hati dengan BlobBuilder karena saya menemukan dukungan terbatas (dan namespace):
Apakah Anda menggunakan polyfill perpustakaan lain untuk BlobBuilder?
sumber
canvas.toBlob()
- tampaknya jauh lebih tepat daripadagetAsFile
.BlobBuilder
tampaknya ditinggalkan dalam mendukungBlob
dapat digunakan tanpa try catch.
Terima kasih untuk check_ca. Kerja bagus.
sumber
Jawaban asli oleh Stoive mudah diperbaiki dengan mengubah baris terakhir untuk mengakomodasi Blob:
sumber
Ini adalah versi ES6 dari jawaban Stoive :
Pemakaian:
sumber
Terima kasih! @steovi untuk solusi ini.
Saya telah menambahkan dukungan ke versi ES6 dan berubah dari unescape ke dataURI (unescape sudah usang).
sumber
sederhanakan: D
sumber
toDataURL memberi Anda sebuah string dan Anda dapat meletakkan string itu ke input tersembunyi.
sumber
<input type=hidden value="data:..." />
akan dilakukan), saya ingin mengunggah data file (seperti apa<input type="file" />
, kecuali Anda tidak diizinkan untuk mengaturvalue
properti pada ini).Saya memiliki masalah yang sama persis dengan Ravinder Payal, dan saya telah menemukan jawabannya. Coba ini:
sumber
window.open(canvas.toDataURL("image/jpeg"))