Saya mencoba melakukan HTTP POST ke server menggunakan Retrofit 2.0
MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/plain");
MediaType MEDIA_TYPE_IMAGE = MediaType.parse("image/*");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
imageBitmap.compress(Bitmap.CompressFormat.JPEG,90,byteArrayOutputStream);
profilePictureByte = byteArrayOutputStream.toByteArray();
Call<APIResults> call = ServiceAPI.updateProfile(
RequestBody.create(MEDIA_TYPE_TEXT, emailString),
RequestBody.create(MEDIA_TYPE_IMAGE, profilePictureByte));
call.enqueue();
Server mengembalikan kesalahan yang mengatakan file tidak valid.
Ini aneh karena saya telah mencoba mengunggah file yang sama dengan format yang sama di iOS (menggunakan perpustakaan lain), tetapi berhasil diunggah.
Saya bertanya-tanya apa cara yang tepat untuk mengunggah gambar menggunakan Retrofit 2.0 ?
Haruskah saya menyimpannya ke disk terlebih dahulu sebelum mengunggah?
PS: Saya telah menggunakan retrofit untuk permintaan Multipart lain yang tidak termasuk gambar dan mereka berhasil diselesaikan. Masalahnya adalah ketika saya mencoba memasukkan byte ke tubuh.
android
retrofit
androidhttpclient
retrofit2
JayVDiyk
sumber
sumber
Jawaban:
Saya menyoroti solusi di 1.9 dan 2.0 karena berguna untuk beberapa
Dalam
1.9
, saya pikir solusi yang lebih baik adalah menyimpan file ke disk dan menggunakannya sebagai file yang diketik seperti:RetroFit 1.9
(Saya tidak tahu tentang implementasi sisi server Anda) memiliki metode antarmuka API yang mirip dengan ini
Dan gunakan itu seperti
Untuk RetroFit 2 Gunakan metode berikut
RetroFit 2.0 (Ini adalah solusi untuk masalah di RetroFit 2 yang diperbaiki sekarang, untuk metode yang benar merujuk jawaban jimmy0251 )
Antarmuka API:
Gunakan seperti:
sumber
@Multipart @POST("/api/Accounts/editaccount") Call<User> editUser(@PartMap Map<String, RequestBody> params);
Dan Ketika Anda memiliki file:Map<String, RequestBody> map = new HashMap<>(); RequestBody fileBody = RequestBody.create(MediaType.parse("image/jpg"), file); map.put("file\"; filename=\"" + file.getName(), fileBody);
MultiPartBody.Part
Ada cara yang benar untuk mengunggah file dengan namanya dengan Retrofit 2 , tanpa peretasan :
Tentukan antarmuka API:
Unggah file seperti ini:
Ini hanya menunjukkan pengunggahan file, Anda juga dapat menambahkan parameter lain dalam metode yang sama dengan
@Part
anotasi.sumber
MultipartBody.Part
argumen di API yang sama.@Part("images[]") List<MultipartBody.Part> images
tetapi memberikan kesalahan bahwa@Part parameters using the MultipartBody.Part must not include a part name
@Body MultipartBody multipartBody
danMultipartBody.Builder
untuk mengirim koleksi gambar.Saya menggunakan Retrofit 2.0 untuk pengguna register saya, mengirim multi-bagian / bentuk File gambar dan teks dari akun register
Di RegisterActivity saya, gunakan AsyncTask
Dan di kelas Register.java saya adalah tempat menggunakan Retrofit dengan panggilan sinkron
Di antarmuka RegisterService
Untuk Utilitas, parsing atau respons InputStream
sumber
Perbarui Kode untuk mengunggah file gambar di Retrofit2.0
Ubah
MediaType.parse("image/*")
keMediaType.parse("image/jpeg")
sumber
@Multipart
kemudian@Part
anotasi harus memberikan nama atau menggunakan tipe parameter MultipartBody.Part.@Part("profile_pic\"; filename=\"pp.png "
Menambah jawaban yang diberikan oleh @insomniac . Anda dapat membuat
Map
untuk menempatkan parameter untukRequestBody
menyertakan gambar.Kode untuk Antarmuka
Kode untuk kelas Java
sumber
Jadi cara yang sangat sederhana untuk mencapai tugas Anda. Anda harus mengikuti langkah di bawah ini: -
1. Langkah pertama
Anda harus menjadikan seluruh panggilan sebagai
@Multipart request
.item
danimage number
hanya string body yang dibungkusRequestBody
. Kami menggunakanMultipartBody.Part class
yang memungkinkan kami untuk mengirim nama file yang sebenarnya selain data file biner dengan permintaan2. Langkah kedua
Sekarang Anda miliki
image path
dan Anda perlu mengkonversi kefile
. Sekarang dikonversifile
menjadiRequestBody
menggunakan metodeRequestBody.create(MediaType.parse("multipart/form-data"), file)
. Sekarang Anda perlu mengkonversi AndaRequestBody requestFile
menjadiMultipartBody.Part
menggunakan metodeMultipartBody.Part.createFormData("Image", file.getName(), requestBody);
.ImageNumber
danItemId
data saya yang lain yang harus saya kirim ke server jadi saya juga membuat keduanyaRequestBody
.Untuk info lebih lanjut
sumber
Mengunggah File menggunakan Retrofit Cukup Sederhana. Anda perlu membuat antarmuka api sebagai
pada gambar kode di atas adalah nama kunci jadi jika Anda menggunakan php Anda akan menulis $ _FILES ['gambar'] ['tmp_name'] untuk mendapatkan ini. Dan nama file = "myfile.jpg" adalah nama file Anda yang dikirim bersama permintaan.
Sekarang untuk mengunggah file, Anda memerlukan metode yang akan memberi Anda jalur absolut dari Uri.
Sekarang Anda dapat menggunakan kode di bawah ini untuk mengunggah file Anda.
Untuk penjelasan lebih rinci, Anda dapat mengunjungi Tutorial File Unggahan Retrofit ini .
sumber
Versi Kotlin dengan pembaruan untuk pencabutan
RequestBody.create
:Antarmuka retrofit
dan untuk Mengunggah
Terima kasih kepada @ jimmy0251
sumber
Jangan gunakan banyak parameter dalam nama fungsi, cukup gunakan konvensi beberapa arg sederhana yang akan meningkatkan keterbacaan kode , karena ini dapat Anda lakukan seperti -
Mungkin ada beberapa pengecualian yang mungkin Anda temui saat menggunakan Retrofit, semua pengecualian yang didokumentasikan sebagai kode , memiliki panduan
retrofit2/RequestFactory.java
. Anda dapat dua fungsiparseParameterAnnotation
dan diparseMethodAnnotation
mana Anda dapat pengecualian dilemparkan, silakan melalui ini, itu akan menghemat banyak waktu Anda daripada googling / stackoverflowsumber
di kotlin cukup mudah, menggunakan metode ekstensi toMediaType , asRequestBody dan toRequestBody berikut ini contohnya:
di sini saya memposting beberapa bidang normal bersama dengan file pdf dan file gambar menggunakan multi-bagian
ini adalah deklarasi API menggunakan retrofit:
dan inilah cara sebenarnya menyebutnya:
sumber