gpt4 book ai didi

android - 使用 okhttp 从资源上传二进制文件

转载 作者:IT老高 更新时间:2023-10-28 23:40:00 30 4
gpt4 key购买 nike

我需要使用 okhttp 将 bundle 在 apk 中的二进制文件上传到服务器。使用 urlconnection,您可以简单地获取 Assets 的输入流,然后将其放入您的请求中。但是,okhttp 只为您提供了上传字节数组、字符串或文件的选项。由于您无法获取 bundle 在 apk 中的 Assets 的文件路径,因此将文件复制到本地文件目录(我宁愿不这样做)然后将文件提供给 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的内部实现

最佳答案

您可能无法直接使用该库来执行此操作,但您可以创建一个小实用程序类来为您执行此操作。然后,您可以在任何需要的地方重复使用它。

public class RequestBodyUtil {

public static RequestBody create(final MediaType mediaType, final InputStream inputStream) {
return new RequestBody() {
@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);
}
}
};
}
}

然后就这么简单地使用它

OkHttpClient client = new OkHttpClient();

MediaType MEDIA_TYPE_MARKDOWN
= MediaType.parse("text/x-markdown; charset=utf-8");

InputStream inputStream = getAssets().open("README.md");

RequestBody requestBody = RequestBodyUtil.create(MEDIA_TYPE_MARKDOWN, inputStream);
Request request = new Request.Builder()
.url("https://api.github.com/markdown/raw")
.post(requestBody)
.build();

Response response = client.newCall(request).execute();
if (!response.isSuccessful())
throw new IOException("Unexpected code " + response);

Log.d("POST", response.body().string());

此示例代码基于 this代码。将 Assets 文件名和 MediaType 替换为您自己的。

关于android - 使用 okhttp 从资源上传二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25367888/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com