我正在尝试做一些我认为相对简单的事情:使用Android SDK将图像上传到服务器.我找到了很多示例代码:
http://linklens.blogspot.com/2009/06/android-multipart-upload.html
但是对我来说都不起作用.我一直遇到的困惑是制作多部分请求真正需要的东西.Android的多部分上传(带图片)的最简单方法是什么?
任何帮助或建议将不胜感激!
我读了一些将jsons发布到服务器的例子.
有人说:
OkHttp是Java提供的HttpUrlConnection接口的实现.它提供了用于编写内容的输入流,并且不知道(或关心)该内容的格式.
现在我想使用名称和密码的参数对URL进行正常发布.
这意味着我需要自己将名称和值对编码为流吗?
我不知道html是如何工作的.我想要做的是与以下内容完全类似,但在android上
<body>
<form action="<%= some_url %>" method="post" enctype="multipart/form-data">
<input type="file" name="myFile">
<input type="submit" value="Submit">
</form>
</body>Run Code Online (Sandbox Code Playgroud)
我尝试了以下代码 -
private static void postToUrl(String url_to_upload_on,
String file_name_with_ext, byte[] byteArray) {
String attachmentName = "file";
String attachmentFileName = file_name_with_ext;
String crlf = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
try{
URL url = new URL(url_to_upload_on);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty(
"Content-Type", "multipart/form-data;boundary=" + boundary);
DataOutputStream request = new DataOutputStream(
connection.getOutputStream());
request.writeBytes(twoHyphens + boundary + crlf);
request.writeBytes("Content-Disposition: form-data; …Run Code Online (Sandbox Code Playgroud) 我想使用okhttp上传图像,但我无法找到Postpart的MultipartBuilder.我可以使用什么而不是这个.
这是我的代码
public static JSONObject uploadImage(File file) {
try {
final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
RequestBody req = new MultipartBuilder().setType(MultipartBody.FORM).addFormDataPart("userid", "8457851245")
.addFormDataPart("userfile","profile.png", RequestBody.create(MEDIA_TYPE_PNG, file)).build();
Request request = new Request.Builder()
.url("url")
.post(req)
.build();
OkHttpClient client = new OkHttpClient();
Response response = client.newCall(request).execute();
Log.d("response", "uploadImage:"+response.body().string());
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)
提前致谢.
我已经使用了okhttp,它可以正常使用以下依赖:
compile 'com.squareup.okhttp:okhttp:2.3.0'
Run Code Online (Sandbox Code Playgroud)
最近我更新了:
compile 'com.squareup.okhttp3:okhttp:3.0.0-RC1'
Run Code Online (Sandbox Code Playgroud)
它显示MultipartBuilder无法解决的错误.
我正在使用我的上传文件上传答案上传图片.
有没有办法实现相同的使用okhttp:3.0.0-RC1?
我正在完成这个使用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对象.其余参数都是字符串和整数.