dio*_*lla 8 java android okhttp
我正在完成这个使用okhttp与web服务进行通信的项目.
对于常规GET和POST,一切正常,但我无法正确上传文件.
okhttp文档非常缺乏这些主题,我在这里或任何地方找到的所有东西似乎都不适用于我的情况.
它应该很简单:我必须发送文件和一些字符串值.但我无法弄清楚如何做到这一点.
根据我发现的一些样本,我首先尝试了这个:
RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM)
.addFormDataPart("group", getGroup())
.addFormDataPart("type", getType())
.addFormDataPart("entity", Integer.toString(getEntity()))
.addFormDataPart("reference", Integer.toString(getReference()))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"task_file\""), RequestBody.create(MediaType.parse("image/png"), getFile()))
.build();
Run Code Online (Sandbox Code Playgroud)
它给了我一个"400错误请求"错误.
所以我从okhttp食谱中尝试了这个:
RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM)
.addPart(Headers.of("Content-Disposition", "form-data; name=\"group\""), RequestBody.create(null, getGroup()))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"type\""), RequestBody.create(null, getType()))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"entity\""), RequestBody.create(null, Integer.toString(getEntity())))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"reference\""), RequestBody.create(null, Integer.toString(getReference())))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"task_file\""), RequestBody.create(MediaType.parse("image/png"), getFile()))
.build();
Run Code Online (Sandbox Code Playgroud)
结果相同.
不知道还有什么可以尝试或调查这个调查.
请求使用以下代码完成:
// adds the required authentication token
Request request = new Request.Builder().url(getURL()).addHeader("X-Auth-Token", getUser().getToken().toString()).post(requestBody).build();
Response response = client.newCall(request).execute();
Run Code Online (Sandbox Code Playgroud)
但我很确定问题是如何构建请求体.
我究竟做错了什么?
编辑:顺便说一句,上面的"getFile()"返回一个File对象.其余参数都是字符串和整数.
dio*_*lla 20
在最初的帖子之后我找到了回答我自己的问题.
我将它留在这里,因为它对其他人有用,因为有几个okhttp上传示例:
RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM)
.addFormDataPart("group", getGroup())
.addFormDataPart("type", getType())
.addFormDataPart("entity", Integer.toString(getEntity()))
.addFormDataPart("reference", Integer.toString(getReference()))
.addFormDataPart("task_file", "file.png", RequestBody.create(MediaType.parse("image/png"), getFile()))
.build();
Run Code Online (Sandbox Code Playgroud)
没有理由在配方中使用"addPart"和"Headers.of"等,addFormDataPart可以解决这个问题.
对于文件字段本身,它需要3个参数:name,filename,然后是文件体.而已.
我只是改变了 addFormDataPart,而不是addPart和最后解决我的问题使用下面的代码:
/**
* Upload Image
*
* @param memberId
* @param sourceImageFile
* @return
*/
public static JSONObject uploadImage(String memberId, String sourceImageFile) {
try {
File sourceFile = new File(sourceImageFile);
Log.d(TAG, "File...::::" + sourceFile + " : " + sourceFile.exists());
final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addFormDataPart("member_id", memberId)
.addFormDataPart("file", "profile.png", RequestBody.create(MEDIA_TYPE_PNG, sourceFile))
.build();
Request request = new Request.Builder()
.url(URL_UPLOAD_IMAGE)
.post(requestBody)
.build();
OkHttpClient client = new OkHttpClient();
Response response = client.newCall(request).execute();
return new JSONObject(response.body().string());
} catch (UnknownHostException | UnsupportedEncodingException e) {
Log.e(TAG, "Error: " + e.getLocalizedMessage());
} catch (Exception e) {
Log.e(TAG, "Other Error: " + e.getLocalizedMessage());
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13221 次 |
| 最近记录: |