UploadDataProvider

public abstract class UploadDataProvider extends Object
implements Closeable

允许嵌入器为 UrlRequest 提供上传主体的抽象类。它支持非分块(大小预先已知)和分块(大小预先未知)上传。请注意,并非所有服务器都支持分块上传。

上传可以是始终分块的(如果数据最终被发送多次,则跨越多次上传),或者从不分块。

公共构造函数摘要

公共方法摘要

void
close()
当请求不再需要此 UploadDataProvider 时调用,以便可以显式释放资源(如文件)。
abstract long
getLength()
如果是非分块上传,返回上传的长度。
abstract void
read(UploadDataSink uploadDataSink, ByteBuffer byteBuffer)
将上传数据读入 byteBuffer
abstract void
rewind(UploadDataSink uploadDataSink)
回退上传数据。

继承方法摘要

公共构造函数

public UploadDataProvider ()

公共方法

public void close ()

当请求不再需要此 UploadDataProvider 时调用,以便可以显式释放资源(如文件)。

抛出
IOException 如果在此过程中发生任何 IOException。如果请求尚未完成,这将导致请求失败;否则将记录下来。

public abstract long getLength ()

如果是非分块上传,返回上传的长度。如果是分块上传,必须始终返回 -1。

返回
  • 对于非分块上传,返回上传长度,否则返回 -1。
抛出
IOException 如果在此过程中发生任何 IOException。

public abstract void read (UploadDataSink uploadDataSink, ByteBuffer byteBuffer)

将上传数据读入 byteBuffer。完成后,缓冲区的 position 将更新到已读取字节的末尾。缓冲区的 limit 不会改变。此方法的每次调用之后都必须紧跟对 uploadDataSink 的单次调用(同步或异步均可):成功时调用 UploadDataSink.onReadSucceeded(boolean),失败时调用 UploadDataSink.onReadError(Exception)。在调用这些方法中的一个之前,read 和 rewind 都不会被调用。即使关联的 UrlRequest 已取消,也必须在资源安全释放之前调用其中一个方法。抛出异常也会导致资源释放并使请求出错。

参数
uploadDataSink 读取成功或失败时通知的对象。
byteBuffer 用于复制读取字节的缓冲区。不要改变 byteBuffer 的 limit。
抛出
IOException 如果在此过程中发生任何 IOException。将调用 UrlRequest.Callback.onFailed(UrlRequest, UrlResponseInfo, CronetException),其中抛出的异常被设置为 CallbackException 的原因。

public abstract void rewind (UploadDataSink uploadDataSink)

回退上传数据。每次调用之后都必须紧跟对 uploadDataSink 的单次调用(同步或异步均可):成功时调用 UploadDataSink.onRewindSucceeded(),失败时调用 UploadDataSink.onRewindError(Exception)。在调用这些方法中的一个之前,read 和 rewind 都不会被调用。即使关联的 UrlRequest 已取消,也必须在资源安全释放之前调用其中一个方法。抛出异常也会导致资源释放并使请求出错。

如果不支持回退,则应调用 UploadDataSink.onRewindError(Exception)。请注意,支持保留上传主体的重定向和服务器对陈旧套接字超时时的重试都需要回退。

参数
uploadDataSink 回退操作成功或失败时通知的对象。
抛出
IOException 如果在此过程中发生任何 IOException。将调用 UrlRequest.Callback.onFailed(UrlRequest, UrlResponseInfo, CronetException),其中抛出的异常被设置为 CallbackException 的原因。