- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将 aws 云服务中的 S3Client 升级到 S3AsyncClient。
我有这个函数可以转换为异步:
public PutObjectResponse uploadFileByUrl(String fileUrl, String builderId, PbModel category, String categoryId)
URL url = new URL(fileUrl);
String[] fileNameArray = url.getFile().split("\\.");
var uniqueFileName = prepareFileName(fileNameArray[fileNameArray.length -1]);
URLConnection connection = url.openConnection();
long contentSize = connection.getContentLengthLong();
InputStream inputStream = connection.getInputStream();
return s3Client.putObject(myObjectRequestBuild, RequestBody.fromInputStream(inputStream, contentSize));
}
我有这个函数可以转换为异步:
public CompletableFuture<PutObjectResponse> uploadFileByUrl(String fileUrl, String builderId, PbModel category, String categoryId)
URL url = new URL(fileUrl);
String[] fileNameArray = url.getFile().split("\\.");
var uniqueFileName = prepareFileName(fileNameArray[fileNameArray.length -1]);
URLConnection connection = url.openConnection();
long contentSize = connection.getContentLengthLong();
InputStream inputStream = connection.getInputStream();
return asyncClient.putObject(myObjectRequestBuild, AsyncRequestBody.fromPublisher(???));
}
正如您在上面的第二种方法中看到的那样,当我将上面的第一个函数转换为异步时,我需要使用 AsyncRequestBody 而不是 RequestBody。AsyncRequestBody 没有 fromInputStream 方法,但它有我想使用的 fromPublisher 方法,fromPublisher 方法作为 Publisher 的参数类型获取。
所以我的问题是如何将我的 inputStream 转换为 Publisher?
最佳答案
AsyncRequestBody doesn't have
fromInputStream
method
正确的,但是它有很多其他方法来创建 AsyncRequestBody
:
fromByteBuffer(ByteBuffer byteBuffer)
fromBytes(byte[] bytes)
fromFile(File file)
fromFile(Path path)
fromPublisher(org.reactivestreams.Publisher<ByteBuffer> publisher)
fromString(String string)
fromString(String string, Charset cs)
考虑到以上情况,您有几个解决方案:
InputStream
使用 IOUtils.toByteArray(inputStream)
到字节数组(或在 Java 9+ 中, inputStream.readAllBytes()
)然后使用 fromBytes
直接byte[]
到 ByteBuffer
使用 ByteBuffer.wrap(byteArray)
然后使用 fromByteBuffer
File
指定文件名的对象,复制 InputStream
的内容到文件的 FileOutputStream
使用 IOUtils.copy()
, 然后使用 fromFile(File file)
File
对象,提供它到 fromFile(Path path)
的路径在你写给它之后是FileOutputStream
InputSteam
到 Publisher<ByteArray>
使用 DataBufferUtils.readByteChannel
来自 Spring 框架,Akka StreamConverters
等,然后使用 fromPublisher
InputStream
到 UTF-8 编码 String
然后使用 fromString(String string)
(如果是 UTF-8 编码,则无需指定 Charset
)InputStream
到非 UTF-8 编码 String
然后使用 fromString(String string, Charset cs)
, 指定 CharSet
当然,上面的一些内容在你的情况下是多余的,例如fromFile(Path path)
适用于您已经存储并转换 InputSteam
的文件到 Publisher<ByteArray>
会很痛苦,但为了完整性,我已经包含了所有可能的解决方案。
我会使用解决方案 #1 来解决这个问题,从而生成上述代码中最干净、最简单的代码。
转换 InputStream
至 byte[]
使用 inputStream.readAllBytes()
然后使用 AsyncRequestBody.fromBytes(...)
.
这应该有效:
public CompletableFuture<PutObjectResponse> uploadFileByUrl(String fileUrl, String builderId, PbModel category, String categoryId)
URL url = new URL(fileUrl);
String[] fileNameArray = url.getFile().split("\\.");
var uniqueFileName = prepareFileName(fileNameArray[fileNameArray.length -1]);
URLConnection connection = url.openConnection();
long contentSize = connection.getContentLengthLong();
InputStream inputStream = connection.getInputStream();
byte[] fileByteArray = inputStream.readAllBytes();
return asyncClient.putObject(myObjectRequestBuild, AsyncRequestBody.fromBytes(fileByteArray));
}
关于java - 将 S3Client 升级到 S3AsyncClient 如何获取 Publisher<ByteBuffer>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69545814/
我有一个空的 byteBuffer 分配为 data = ByteBuffer.allocateDirect(layerSize(0, faces - 1, 0, levels - 1) * laye
虽然存在 ByteBuffer.put(ByteBuffer) 方法,但 ByteBuffer.get(ByteBuffer) 似乎丢失了?我应该如何从较大的 ByteBuffer 读取较小的 Byt
我在 Dart Web 应用程序中加载二进制文件,其中包含压缩音频数据作为二进制数据的一部分。当数据通过 http 请求加载时,它作为一个 ByteBuffer 出现,我理解它是 Dart 对 JS
假设我有一个列表/数组列表或字节缓冲区数组(List 或 ByteBuffer[]) 是否可以由此直接从上述数组中获取字节,而无需遍历所有项或计算它们的总大小?我正在寻找这样的东西: ByteBuff
我有一个或多个 ByteBuffer,其中包含一条消息的部分内容。现在我想阅读此消息,但我不想将 N ByteBuffer 复制到一个中。我的解析器需要一个包含完整消息的 ByteBuffer,但我的
如果已知它是其他缓冲区? 我知道这可以通过非直接数组支持的 ByteBuffer 使用 arrayOffset() 方法来完成,如下所示: int getRelativeBufferOffset(By
如何在 Dart 中将 ByteBuffer 的字节快速复制到另一个更大的 ByteBuffer(以非零偏移量)? 有一些缓慢的方法可以做到这一点。一种是将每个都转换为 Uint8List 并一次复制
嘿嘿, ByteBuffers 以及 netty 的 ByteBuff 使用索引来存储它们当前“所在”的位置。在我的应用程序开始时,我加载 ByteBuffers/ByteBuffs 中的多个文件以便
我知道 flip() 将当前缓冲区位置设置为 0,并将限制设置为上一个缓冲区位置,而 rewind() 只是将当前缓冲区位置设置为 0。 在下面的代码中,我使用 rewind() 或 flip() 得
我有一个数组 ByteBuffer s(实际上代表整数)。我想在数组中分离唯一和非唯一的 ByteBuffer(即整数)。因此我使用这种类型的 HashSet: HashSet columnsSet
我的代码中有一个 java.nio.ByteBuffer: ByteBuffer bb = ByteBuffer.allocateDirect(1024); ... 我希望能够将其替换为 ByteBu
我需要将代码从 Java 移植到 C#。在Java代码中,使用了方法“ByteBuffer.flip()”和“ByteBuffer.slice”,不知道怎么翻译。 我读过这个问题 ( An equiv
以下 Java 代码可以编译,但在运行时会出错: # javac ByteBufTest.java # java ByteBufTest Exception in thread "main" java
我有一个方法如下,它已经正常运行了很长时间: private String loadFromFile(){ RandomAccessFile inFile = null; FileCh
用户在测试中遇到了此崩溃。我的第一个猜测是这与内存有关,但除此之外我没有什么可做的。更深入地研究代码,我认为这可能是主线程问题,但看起来监听器在后台线程上被删除,所以我怀疑这就是原因。 我认为在应用程
以下代码(此为简化版)以前在jdk1.6中运行良好,现在在jdk 1.7下断言失败。 ByteBuffer buffer = ...; buffer.mark(); char c = (char) b
我有一个 10MB 的二进制文件。我需要以不同大小的 block (例如 300、273 字节)读取它。为了阅读,我使用 FileChannel 和 ByteBuffer。现在,对于每次读取迭代,我都
我想要做的是获取一个十进制整数,将其转换为十六进制,然后分隔字节。 据我了解,ByteBuffer 是实现此目的的最佳方法。整数不会超过65535,因此十六进制数保证为2个字节。例如,我有一个整数 4
我正在写一些使用 ByteBuffer 的东西s。在 docs of the API它说 There is no way to free a buffer explicitly (without JV
我正在尝试读取一个短数组,转换其元素并将它们放入字节数组中。我使用 ByteBuffer 并收回此异常: 线程“main”中的异常 java.lang.IndexOutOfBoundsExceptio
我是一名优秀的程序员,十分优秀!