![](/img/trans.png)
[英]Uploading images to server from gallery/camera using retrofit 2 (okhttp issue)
[英]Uploading images to server using retrofit
我正在嘗試使用改造 2 將圖像上傳到服務器。 我認為我發送數據的方式不正確,但我還沒有弄清楚我的問題在哪里。
我應該以這種格式發送數據: {"file": image, "userID": userId}
這是我在改造@POST("avatar") fun uploadImage(@Body data: Data ) : Call<ResponseBody>
代碼: @POST("avatar") fun uploadImage(@Body data: Data ) : Call<ResponseBody>
我用文件和用戶 ID 創建了一個對象 Data 我不知道這是否是正確的方法。 我也看過這個例子
ublic interface UploadAPIs {
@Multipart
@POST("/upload")
Call<ResponseBody> uploadImage(@Part MultipartBody.Part file, @Part("name") RequestBody requestBody);
}
但我真的不太明白,我怎么能用部分多部分來發送一個對象
這就是我創建從片段中的圖庫獲取的圖像文件的方式
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK)
when(requestCode){
GALLERY -> {
val selectedImage= data!!.data
val file = File(selectedImage.path)
val data = Data(file, userID)
val call = api!!.uploadImage(data)
call.enqueue(object: Callback<ResponseBody>{
override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
Toast.makeText(context, t.message, Toast.LENGTH_SHORT).show()
}
override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
val response = response.body()!!.string()
println("Response " + response)
//response says user does not exist because the way I send data is not correct
}
})
}
CAMERA -> {
//code here
}
}
}
這是我為 Data 對象創建的類
class Data (val file: File, userID: Int)
如果有人可以幫助我,我將不勝感激:)
更新代碼:
@Multipart
@POST("avatar")
fun uploadImage(
@Part("userID") user_ID: RequestBody,
@Part image: MultipartBody.Part) : Call<ResponseBody>
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK)
when(requestCode){
GALLERY -> {
val selectedImage= data!!.data
val bitmap = MediaStore.Images.Media.getBitmap(context!!.contentResolver, selectedImage)
avatar.setImageBitmap(bitmap)
val file = File(getRealPathFromURI(selectedImage))
val id = RequestBody.create(MediaType.parse("text/plain"), userID.toString())
//val reqBody = RequestBody.create(MediaType.parse(activity!!.contentResolver.getType(selectedImage)!!), file)
val reqBody = RequestBody.create(MediaType.parse("image/*"), file)
val body = MultipartBody.Part.createFormData("file", file.name, reqBody)
val call = api!!.uploadImage(id, body)
call.enqueue(object: Callback<ResponseBody>{
override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
Toast.makeText(context, t.message, Toast.LENGTH_SHORT).show()
println("Failure")
}
override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
if (response.isSuccessful){
println("Successful " + response.body()?.string())
}else{
response.errorBody()?.string()
println("Error " + response.headers().toString())
}
}
})
}
CAMERA -> {
//code
}
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK)
when(requestCode){
GALLERY -> {
val selectedImage= data!!.data
val bitmap = MediaStore.Images.Media.getBitmap(context!!.contentResolver, selectedImage)
avatar.setImageBitmap(bitmap)
val file = File(getRealPathFromURI(selectedImage))
val id = RequestBody.create(MediaType.parse("text/plain"), userID.toString())
val reqBody = RequestBody.create(MediaType.parse("image/jpeg"), file)
val body = MultipartBody.Part.createFormData("file", file.name, reqBody)
val api = RetrofitClient.getInstance().apiService
val call = api!!.uploadImage(id, body)
call.enqueue(object: Callback<ResponseBody>{
override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
Toast.makeText(context, t.message, Toast.LENGTH_SHORT).show()
println("Failure")
}
override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
if (response.isSuccessful){
println("Successful " + response.body()?.string())
}else{
response.errorBody()?.string()
println("Error " + response.headers().toString())
}
}
})
}
CAMERA -> {
//code here
}
}
}
在 API 接口中:
@Multipart
@POST("avatar")
fun uploadImage(
@Part("userID") user_ID: RequestBody,
/*@Part("file") name: RequestBody*/
@Part image: MultipartBody.Part) : Call<ResponseBody>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.