Ini mungkin akan menjadi pertanyaan bodoh tapi saya mengalami salah satu malam itu. Dalam aplikasi saya sedang mengembangkan RESTful API dan kami ingin klien mengirim data sebagai JSON. Bagian dari aplikasi ini mengharuskan klien untuk mengunggah file (biasanya gambar) serta informasi tentang gambar.
Saya mengalami kesulitan melacak bagaimana ini terjadi dalam satu permintaan. Apakah mungkin untuk Base64 data file menjadi string JSON? Apakah saya perlu melakukan 2 posting ke server? Haruskah saya tidak menggunakan JSON untuk ini?
Sebagai catatan, kami menggunakan Grails di backend dan layanan ini diakses oleh klien seluler asli (iPhone, Android, dll), jika ada yang membuat perbedaan.
json
rest
grails
file-upload
Gregg
sumber
sumber
Jawaban:
Saya mengajukan pertanyaan serupa di sini:
Bagaimana cara mengunggah file dengan metadata menggunakan layanan web REST?
Anda pada dasarnya memiliki tiga pilihan:
multipart/form-data
POST, dan kembalikan ID ke klien. Klien kemudian mengirimkan metadata dengan ID, dan server menghubungkan kembali file dan metadata.sumber
Anda dapat mengirim file dan data ke dalam satu permintaan menggunakan tipe konten multipart / form-data :
Dari http://www.faqs.org/rfcs/rfc2388.html :
Anda dapat memasukkan informasi file atau informasi bidang dalam setiap bagian di antara batas. Saya telah berhasil mengimplementasikan layanan RESTful yang mengharuskan pengguna untuk mengirimkan data dan formulir, dan multipart / formulir-data bekerja dengan sempurna. Layanan ini dibangun menggunakan Java / Spring, dan klien menggunakan C #, jadi sayangnya saya tidak punya contoh Grails untuk memberi Anda tentang cara mengatur layanan. Anda tidak perlu menggunakan JSON dalam hal ini karena setiap bagian "formulir-data" memberi Anda tempat untuk menentukan nama parameter dan nilainya.
Hal yang baik tentang menggunakan multipart / form-data adalah Anda menggunakan header yang didefinisikan HTTP, jadi Anda tetap berpegang pada filosofi REST untuk menggunakan alat HTTP yang ada untuk membuat layanan Anda.
sumber
Saya tahu bahwa utas ini cukup lama, namun, saya kehilangan satu opsi di sini. Jika Anda memiliki metadata (dalam format apa pun) yang ingin Anda kirim bersama dengan data yang akan diunggah, Anda dapat membuat satu
multipart/related
permintaan.Anda dapat memeriksa spesifikasi RFC 2387 untuk detail lebih mendalam.
Pada dasarnya setiap bagian dari permintaan semacam itu dapat memiliki konten dengan tipe yang berbeda dan semua bagian saling terkait (misalnya gambar dan metadata). Bagian-bagian diidentifikasi oleh string batas, dan string batas akhir diikuti oleh dua tanda hubung.
Contoh:
sumber
Saya tahu pertanyaan ini sudah lama, tetapi pada hari-hari terakhir saya telah mencari seluruh web untuk menyelesaikan pertanyaan yang sama. Saya memiliki layanan web REST grails dan Klien iPhone yang mengirim gambar, judul, dan deskripsi.
Saya tidak tahu apakah pendekatan saya adalah yang terbaik, tetapi sangat mudah dan sederhana.
Saya mengambil gambar menggunakan UIImagePickerController dan mengirim ke server NSData menggunakan tag header permintaan untuk mengirim data gambar.
Di sisi server, saya menerima foto menggunakan kode:
Saya tidak tahu apakah saya memiliki masalah di masa depan, tetapi sekarang bekerja dengan baik di lingkungan produksi.
sumber
Ini API pendekatan saya (saya menggunakan contoh) - seperti yang Anda lihat, Anda saya tidak menggunakan
file_id
(pengidentifikasi file yang diunggah ke server) di API:Buat
photo
objek di server:Unggah file (catatan yang
file
berbentuk tunggal karena hanya satu per foto):Dan kemudian misalnya:
Baca daftar foto
Baca beberapa detail foto
Baca file foto
Jadi kesimpulannya adalah, pertama Anda membuat objek (foto) dengan POST, dan kemudian Anda mengirim permintaan kedua dengan file (lagi POST).
sumber
Objek FormData: Unggah File Menggunakan Ajax
XMLHttpRequest Level 2 menambahkan dukungan untuk antarmuka FormData baru. Objek FormData menyediakan cara untuk dengan mudah membangun satu set pasangan kunci / nilai yang mewakili bidang formulir dan nilainya, yang kemudian dapat dengan mudah dikirim menggunakan metode send () XMLHttpRequest.
https://developer.mozilla.org/en-US/docs/Web/API/FormData
sumber
Karena satu-satunya contoh yang hilang adalah contoh ANDROID , saya akan menambahkannya. Teknik ini menggunakan AsyncTask khusus yang harus dideklarasikan di dalam kelas Activity Anda.
Jadi, ketika Anda ingin mengunggah file, panggil saja:
sumber
Saya ingin mengirim beberapa string ke server backend. Saya tidak menggunakan json dengan multipart, saya telah menggunakan params permintaan.
Url akan terlihat seperti
Saya melewati dua params (uuid dan tipe) bersama dengan unggahan file. Semoga ini akan membantu yang tidak memiliki data json kompleks untuk dikirim.
sumber
Anda dapat mencoba menggunakan perpustakaan https://square.github.io/okhttp/ . Anda dapat mengatur badan permintaan untuk mengalikan dan kemudian menambahkan file dan objek json secara terpisah seperti:
sumber
sumber
Harap pastikan bahwa Anda telah mengikuti impor. Tentu impor standar lainnya
sumber
java.lang.ClassCastException: org.springframework.core.io.FileSystemResource cannot be cast to java.lang.String