我需要使用OkHttp将打包在APK中的二进制文件上传到服务器。使用URLConnection,您可以简单地获取到一个资产的InputStream,然后将其放入请求中。然而,OkHttp只给出了上传字节数组、字符串或文件的选项。由于无法获取APK中捆绑的资产的文件路径,唯一的选择是将文件复制到本地文件目录(我宁愿不这样做),然后将文件提供给OkHttp吗?难道没有直接使用AssetInputStream向Web服务器发出请求的方法吗?
编辑:我使用了被接受的答案,但是我没有创建一个静态的实用程序类,而是子类化了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的内部实现相匹配。