public final class MediaHttpUploader extends Object
For resumable uploads, when the media content length is known, if the provided InputStream
has InputStream.markSupported()
as false
then it is wrapped in an
BufferedInputStream
to support the InputStream.mark(int)
and InputStream.reset()
methods required for handling server errors. If the media content length is unknown then each
chunk is stored temporarily in memory. This is required to determine when the last chunk is
reached.
See setDisableGZipContent(boolean)
for information on when content is gzipped and how
to control that behavior.
Back-off is disabled by default. To enable it for an abnormal HTTP response and an I/O
exception you should call HttpRequest.setUnsuccessfulResponseHandler(com.google.api.client.http.HttpUnsuccessfulResponseHandler)
with a new HttpBackOffUnsuccessfulResponseHandler
instance and HttpRequest.setIOExceptionHandler(com.google.api.client.http.HttpIOExceptionHandler)
with HttpBackOffIOExceptionHandler
.
Upgrade warning: in prior version 1.14 exponential back-off was enabled by default for an abnormal HTTP response and there was a regular retry (without back-off) when I/O exception was thrown. Starting with version 1.15 back-off is disabled and there is no retry on I/O exception by default.
Upgrade warning: in prior version 1.16 serverErrorCallback()
was public but starting
with version 1.17 it has been removed from the public API, and changed to be package private.
Implementation is not thread-safe.
Modifier and Type | Class and Description |
---|---|
static class |
MediaHttpUploader.UploadState
Upload state associated with the Media HTTP uploader.
|
Modifier and Type | Field and Description |
---|---|
static String |
CONTENT_LENGTH_HEADER
Upload content type header.
|
static String |
CONTENT_TYPE_HEADER
Upload content length header.
|
static int |
DEFAULT_CHUNK_SIZE
Default maximum number of bytes that will be uploaded to the server in any single HTTP request
(set to 10 MB).
|
static int |
MINIMUM_CHUNK_SIZE
Minimum number of bytes that can be uploaded to the server (set to 256KB).
|
Constructor and Description |
---|
MediaHttpUploader(AbstractInputStreamContent mediaContent,
HttpTransport transport,
HttpRequestInitializer httpRequestInitializer)
Construct the
MediaHttpUploader . |
Modifier and Type | Method and Description |
---|---|
int |
getChunkSize()
Returns the maximum size of individual chunks that will get uploaded by single HTTP requests.
|
boolean |
getDisableGZipContent()
Returns whether to disable GZip compression of HTTP content.
|
HttpHeaders |
getInitiationHeaders()
Returns the HTTP headers used for the initiation request.
|
String |
getInitiationRequestMethod()
Returns the HTTP method used for the initiation request.
|
HttpContent |
getMediaContent()
Returns the HTTP content of the media to be uploaded.
|
HttpContent |
getMetadata()
Returns HTTP content metadata for the media request or
null for none. |
long |
getNumBytesUploaded()
Gets the total number of bytes the server received so far or
0 for direct uploads when
the content length is not known. |
double |
getProgress()
Gets the upload progress denoting the percentage of bytes that have been uploaded, represented
between 0.0 (0%) and 1.0 (100%).
|
MediaHttpUploaderProgressListener |
getProgressListener()
Returns the progress listener to send progress notifications to or
null for none. |
Sleeper |
getSleeper()
Returns the sleeper.
|
HttpTransport |
getTransport()
Returns the transport to use for requests.
|
MediaHttpUploader.UploadState |
getUploadState()
Gets the current upload state of the uploader.
|
boolean |
isDirectUploadEnabled()
Returns whether direct media upload is enabled or disabled.
|
MediaHttpUploader |
setChunkSize(int chunkSize)
Sets the maximum size of individual chunks that will get uploaded by single HTTP requests.
|
MediaHttpUploader |
setDirectUploadEnabled(boolean directUploadEnabled)
Sets whether direct media upload is enabled or disabled.
|
MediaHttpUploader |
setDisableGZipContent(boolean disableGZipContent)
Sets whether to disable GZip compression of HTTP content.
|
MediaHttpUploader |
setInitiationHeaders(HttpHeaders initiationHeaders)
Sets the HTTP headers used for the initiation request.
|
MediaHttpUploader |
setInitiationRequestMethod(String initiationRequestMethod)
Sets the HTTP method used for the initiation request.
|
MediaHttpUploader |
setMetadata(HttpContent metadata)
Sets HTTP content metadata for the media request or
null for none. |
MediaHttpUploader |
setProgressListener(MediaHttpUploaderProgressListener progressListener)
Sets the progress listener to send progress notifications to or
null for none. |
MediaHttpUploader |
setSleeper(Sleeper sleeper)
Sets the sleeper.
|
HttpResponse |
upload(GenericUrl initiationRequestUrl)
Executes a direct media upload or resumable media upload conforming to the specifications
listed here.
|
public static final String CONTENT_LENGTH_HEADER
public static final String CONTENT_TYPE_HEADER
public static final int MINIMUM_CHUNK_SIZE
public static final int DEFAULT_CHUNK_SIZE
public MediaHttpUploader(AbstractInputStreamContent mediaContent, HttpTransport transport, HttpRequestInitializer httpRequestInitializer)
MediaHttpUploader
.
The input stream received by calling AbstractInputStreamContent.getInputStream()
is
closed when the upload process is successfully completed. For resumable uploads, when the media
content length is known, if the input stream has InputStream.markSupported()
as false
then it is wrapped in an BufferedInputStream
to support the InputStream.mark(int)
and InputStream.reset()
methods required for handling server errors. If
the media content length is unknown then each chunk is stored temporarily in memory. This is
required to determine when the last chunk is reached.
mediaContent
- The Input stream content of the media to be uploadedtransport
- The transport to use for requestshttpRequestInitializer
- The initializer to use when creating an HttpRequest
or
null
for nonepublic HttpResponse upload(GenericUrl initiationRequestUrl) throws IOException
This method is not reentrant. A new instance of MediaHttpUploader
must be
instantiated before upload called be called again.
If an error is encountered during the request execution the caller is responsible for parsing the response correctly. For example for JSON errors:
if (!response.isSuccessStatusCode()) {
throw GoogleJsonResponseException.from(jsonFactory, response);
}
Callers should call HttpResponse.disconnect()
when the returned HTTP response object
is no longer needed. However, HttpResponse.disconnect()
does not have to be called if the
response stream is properly closed. Example usage:
HttpResponse response = batch.upload(initiationRequestUrl);
try {
// process the HTTP response object
} finally {
response.disconnect();
}
initiationRequestUrl
- The request URL where the initiation request will be sentIOException
public HttpContent getMetadata()
null
for none.public MediaHttpUploader setMetadata(HttpContent metadata)
null
for none.public HttpContent getMediaContent()
public HttpTransport getTransport()
public MediaHttpUploader setDirectUploadEnabled(boolean directUploadEnabled)
If value is set to true
then a direct upload will be done where the whole media
content is uploaded in a single request. If value is set to false
then the upload uses
the resumable media upload protocol to upload in data chunks.
Direct upload is recommended if the content size falls below a certain minimum limit. This is because there's minimum block write size for some Google APIs, so if the resumable request fails in the space of that first block, the client will have to restart from the beginning anyway.
Defaults to false
.
public boolean isDirectUploadEnabled()
true
then a direct upload will be done where the whole media content is uploaded in a single
request. If value is set to false
then the upload uses the resumable media upload
protocol to upload in data chunks. Defaults to false
.public MediaHttpUploader setProgressListener(MediaHttpUploaderProgressListener progressListener)
null
for none.public MediaHttpUploaderProgressListener getProgressListener()
null
for none.public MediaHttpUploader setChunkSize(int chunkSize)
DEFAULT_CHUNK_SIZE
.
The minimum allowable value is MINIMUM_CHUNK_SIZE
and the specified chunk size must
be a multiple of MINIMUM_CHUNK_SIZE
.
public int getChunkSize()
DEFAULT_CHUNK_SIZE
.public boolean getDisableGZipContent()
public MediaHttpUploader setDisableGZipContent(boolean disableGZipContent)
By default it is false
.
If setDisableGZipContent(boolean)
is set to false (the default value) then content
is gzipped for direct media upload and resumable media uploads when content length is not
known. Due to a current limitation, content is not gzipped for resumable media uploads when
content length is known; this limitation will be removed in the future.
public Sleeper getSleeper()
public MediaHttpUploader setSleeper(Sleeper sleeper)
Sleeper.DEFAULT
.public String getInitiationRequestMethod()
The default value is HttpMethods.POST
.
public MediaHttpUploader setInitiationRequestMethod(String initiationRequestMethod)
Can only be HttpMethods.POST
(for media upload) or HttpMethods.PUT
(for
media update). The default value is HttpMethods.POST
.
public MediaHttpUploader setInitiationHeaders(HttpHeaders initiationHeaders)
public HttpHeaders getInitiationHeaders()
public long getNumBytesUploaded()
0
for direct uploads when
the content length is not known.public MediaHttpUploader.UploadState getUploadState()
public double getProgress() throws IOException
Do not use if the specified AbstractInputStreamContent
has no content length
specified. Instead, consider using getNumBytesUploaded()
to denote progress.
IllegalArgumentException
- if the specified AbstractInputStreamContent
has no
content lengthIOException
Copyright © 2010–2022 Google. All rights reserved.