【发布时间】:2014-10-11 15:17:17
【问题描述】:
我需要使用 okhttp 将捆绑在 apk 中的二进制文件上传到服务器。使用 urlconnection,您可以简单地获取资产的输入流,然后将其放入您的请求中。但是,okhttp 只为您提供了上传字节数组、字符串或文件的选项。由于您无法获取捆绑在 apk 中的资产的文件路径,因此将文件复制到本地文件目录(我宁愿不这样做)然后将文件提供给 okhttp 是唯一的选择吗?有没有办法简单地使用assetinputstream 直接向网络服务器发出请求?
编辑:我使用了公认的答案,但我没有创建静态实用程序类,而是简单地将 RequestBody 子类化
public class InputStreamRequestBody extends RequestBody {
private InputStream inputStream;
private MediaType mediaType;
public static RequestBody create(final MediaType mediaType, final InputStream inputStream) {
return new InputStreamRequestBody(inputStream, mediaType);
}
private InputStreamRequestBody(InputStream inputStream, MediaType mediaType) {
this.inputStream = inputStream;
this.mediaType = mediaType;
}
@Override
public MediaType contentType() {
return mediaType;
}
@Override
public long contentLength() {
try {
return inputStream.available();
} catch (IOException e) {
return 0;
}
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
Source source = null;
try {
source = Okio.source(inputStream);
sink.writeAll(source);
} finally {
Util.closeQuietly(source);
}
}
}
我对这种方法的唯一担忧是 inputstream.available() 对于内容长度的不可靠性。静态构造函数是为了匹配okhttp的内部实现
【问题讨论】:
-
嗯,你可以按照你说的把内容放在一个字节数组中。
-
我就是这么做的。不过,我仍然更喜欢直接从资产中获取输入流的解决方案。