Karena pengembang Android merekomendasikan untuk menggunakan HttpURLConnection
kelas ini, saya bertanya-tanya apakah ada yang bisa memberi saya contoh yang baik tentang cara mengirim "file" bitmap (sebenarnya aliran dalam memori) melalui POST ke server HTTP Apache. Saya tidak tertarik dengan cookie atau otentikasi atau sesuatu yang rumit, tetapi saya hanya ingin memiliki implementasi yang andal dan logis. Semua contoh yang saya lihat di sekitar sini lebih terlihat seperti "mari kita coba ini dan mungkin berhasil".
Sekarang, saya memiliki kode ini:
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL("http://example.com/server.cgi");
urlConnection = (HttpURLConnection) url.openConnection();
} catch (Exception e) {
this.showDialog(getApplicationContext(), e.getMessage());
}
finally {
if (urlConnection != null)
{
urlConnection.disconnect();
}
}
di mana showDialog seharusnya hanya menampilkan AlertDialog
(jika ada URL yang tidak valid?).
Sekarang, katakanlah saya menghasilkan bitmap seperti ini: Bitmap image = this.getBitmap()
di dalam kontrol yang diturunkan dari View
dan saya ingin mengirimkannya melalui POST. Apa prosedur yang tepat untuk mencapai hal seperti itu? Kelas apa yang perlu saya gunakan? Bisakah saya menggunakan HttpPost
seperti dalam contoh ini ? Jika demikian, bagaimana saya membuat InputStreamEntity
untuk bitmap saya? Saya akan merasa menjijikkan jika diminta untuk menyimpan bitmap terlebih dahulu dalam sebuah file di perangkat.
Saya juga harus menyebutkan bahwa saya benar-benar perlu mengirim setiap piksel yang tidak diubah dari bitmap asli ke server, jadi saya tidak dapat mengubahnya menjadi JPEG.
sumber
Jawaban:
Saya tidak tahu mengapa
HttpURLConnection
kelas tidak menyediakan sarana apa pun untuk mengirim file tanpa harus membuat pembungkus file secara manual. Inilah yang akhirnya saya lakukan, tetapi jika seseorang mengetahui solusi yang lebih baik, beri tahu saya.Memasukan data:
Barang statis:
Siapkan permintaan:
Mulai pembungkus konten:
Ubah
Bitmap
menjadiByteBuffer
:Akhiri pembungkus konten:
Buffer keluaran siram:
Dapatkan tanggapan:
Tutup aliran tanggapan:
Tutup koneksi:
PS: Tentu saja saya harus memasukkan permintaan tersebut
private class AsyncUploadBitmaps extends AsyncTask<Bitmap, Void, String>
, untuk membuat platform Android senang, karena tidak suka memiliki permintaan jaringan di utas utama.sumber
url
variabel, seperti:URL url = new URL("http://example.com/?param1=val1¶m2=val2");
. Anda dapat menambahkan sebanyak yang Anda inginkan (meskipun menurut saya ada beberapa batasan).Saya sebenarnya menemukan cara yang lebih baik untuk mengirim file menggunakan HttpURLConnection menggunakan MultipartEntity
Dengan asumsi Anda mengupload gambar dengan data bitmap:
Dan Voila! Data posting Anda akan berisi bidang gambar bersama dengan nama file dan jalur di server Anda.
sumber
Untuk mengupload file di server dengan beberapa parameter menggunakan
MultipartUtility
cara yang sederhana.MultipartUtility.java
Untuk
upload
Andafile
bersama dengan parameter.CATATAN: letakkan kode ini di bawah ini di non-ui-thread untuk mendapatkan respons.
sumber
Solusi Jaydipsinh Zala tidak berhasil untuk saya, saya tidak tahu mengapa tetapi tampaknya mendekati solusi.
Jadi menggabungkan yang satu ini dengan solusi dan penjelasan hebat dari Mihai Todor , hasilnya adalah kelas yang saat ini cocok untuk saya. Jika itu membantu seseorang:
MultipartUtility2V.java
sumber
Jawaban ini https://stackoverflow.com/a/33149413/6481542 memberi saya 90% cara mengunggah file besar ke server pengembangan Django, tetapi saya harus menggunakan setFixedLengthStreamingMode untuk membuatnya bekerja. Untuk itu diperlukan pengaturan Panjang-Konten sebelum menulis konten, sehingga membutuhkan penulisan ulang yang cukup signifikan dari jawaban di atas. Inilah hasil akhir saya
Penggunaan sebagian besar sama seperti pada jawaban di atas, tetapi saya telah menyertakan dukungan CSRF yang digunakan Django secara default dengan formulir
sumber
berdasarkan solusi Mihai, jika ada yang memiliki masalah dalam menyimpan gambar di server seperti yang terjadi di server saya. ubah Bitmap menjadi bagian bytebuffer menjadi:
sumber
Saya belum menguji ini, tetapi Anda dapat mencoba menggunakan PipedInputStream dan PipedOutputStream. Ini mungkin terlihat seperti:
sumber
Inilah yang saya lakukan untuk mengunggah foto menggunakan permintaan pos.
CATATAN: Kode ini membutuhkan perpustakaan jadi Ikuti instruksi di sini untuk mendapatkan perpustakaan.
sumber
HttpClient
(tautan Anda sudah usang. Gunakan yang ini saja), yang disimpan oleh orang-orang Android hanya untuk kompatibilitas ke belakang, daripada menggunakan bawaanHttpURLConnection
. Di sisi lain, sepertinya membutuhkan lebih banyak pekerjaan untuk menyiapkannya, jadi mungkin itu tidak sepadan dengan usaha.Saya merasa menggunakan okHttp jauh lebih mudah karena saya tidak bisa mendapatkan solusi ini untuk bekerja: https://stackoverflow.com/a/37942387/447549
sumber
Saya mencoba solusi di atas dan tidak ada yang berhasil untuk saya di luar kotak.
Namun http://www.baeldung.com/httpclient-post-http-request . Baris 6 Permintaan Multibagian POST bekerja dalam hitungan detik
sumber