O upload de arquivos grandes em uma rede sem fio pode demorar bastante. Condições de rede instáveis ou alterações na rede podem causar falha no upload. Se um upload falhar, o arquivo inteiro precisa ser reenviado. Para resolver esse problema, o kit de desenvolvimento de software (SDK) para iOS oferece o recurso de upload resumível.
Informações gerais
Recomendamos não usar o upload resumível para objetos menores que 5 GB a partir de um dispositivo móvel. O upload resumível utiliza o recurso de upload multipart. O upload resumível de um único objeto requer várias solicitações de rede, o que o torna ineficiente. Ao fazer upload de um objeto maior que 5 GB por meio de upload resumível, observe os seguintes itens:
-
Antes do upload resumível
Antes de fazer upload de um objeto para o OSS por meio de upload resumível, você pode especificar um diretório para o arquivo de checkpoint que armazena o progresso do upload resumível. O arquivo de checkpoint se aplica apenas à tarefa de upload resumível atual.
-
Se você não especificar o diretório para o arquivo de checkpoint e uma parte de um objeto grande falhar no upload devido a problemas de rede, será necessário muito tempo e uma grande quantidade de tráfego para reenviar o objeto inteiro.
-
Se você especificar o diretório para o arquivo de checkpoint, uma tarefa de upload resumível que falhou poderá ser retomada a partir da posição registrada no arquivo de checkpoint.
-
-
Durante um upload resumível
-
O upload resumível permite enviar apenas arquivos locais. O upload resumível oferece suporte ao recurso de callback de upload, utilizado da mesma forma que em tarefas de upload comuns. Para mais informações, consulte Callback.
-
É possível realizar o upload resumível chamando as seguintes operações de API: InitMultipartUpload, UploadPart, ListParts, CompleteMultipartUpload e AbortMultipartUpload. Para realizar o upload resumível usando Security Token Service (STS), verifique se você tem autorização para chamar as operações de API mencionadas.
-
Por padrão, a validação MD5 é ativada para cada parte durante um upload resumível. Portanto, não é necessário definir o cabeçalho
Content-Md5na solicitação. -
Se uma tarefa não puder ser retomada por um longo período, uploads multipart incompletos podem se acumular no OSS. Defina regras de ciclo de vida para o bucket para excluir periodicamente essas partes. Para mais informações, consulte Gerenciamento de ciclo de vida.
nullSe você cancelar uma tarefa de upload resumível, as partes já enviadas ao servidor serão excluídas por padrão. Para manter os registros de breakpoint ao cancelar uma tarefa, especifique uma pasta para os registros e modifique o parâmetro deleteUploadIdOnCancelling. Se o servidor mantiver os registros por um período prolongado e uma regra de ciclo de vida excluir as partes do servidor, os registros no servidor e no cliente móvel poderão ficar inconsistentes.
-
Observações
-
Antes de usar os exemplos neste tópico, crie um OSSClient usando um nome de domínio personalizado ou Security Token Service (STS). Para mais informações, consulte Inicialização (iOS SDK).
nullA região do bucket é determinada pelo endpoint especificado na configuração de inicialização.
-
Para fazer upload de um arquivo, você precisa ter a permissão
oss:PutObject. Para mais informações, consulte Conceder políticas de acesso personalizadas a um usuário RAM.
Código de exemplo
-
Para salvar registros de breakpoint localmente, chame o método
resumableUploadpara realizar um upload resumível conforme a seguir:OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new]; resumableUpload.bucketName = OSS_BUCKET_PRIVATE; //... NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; resumableUpload.recordDirectoryPath = cachesDir;nullSe um upload resumível falhar, um arquivo de registro de breakpoint será criado. O upload será retomado a partir do breakpoint até ser concluído. Após a conclusão bem-sucedida do upload, o arquivo de registro de breakpoint será excluído automaticamente. Por padrão, os registros de breakpoint não são salvos localmente.
-
O código a seguir fornece um exemplo completo de upload resumível:
// Obtain the UploadId to upload the file. OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new]; resumableUpload.bucketName = <bucketName>; // objectKey is the same as objectName. It specifies the full path of the object that you want to upload to OSS, including the file extension. For example, abc/efg/123.jpg. resumableUpload.objectKey = <objectKey>; resumableUpload.partSize = 1024 * 1024; resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) { NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend); }; NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; // Set the path to save the breakpoint record. resumableUpload.recordDirectoryPath = cachesDir; // Set the deleteUploadIdOnCancelling parameter to NO. This indicates that the breakpoint record file is not deleted. If the upload fails, the upload resumes from the breakpoint until the file is completely uploaded. If you do not set this parameter, the default value YES is used. This indicates that the breakpoint record file is deleted. The next time you upload the same file, the upload starts from the beginning. resumableUpload.deleteUploadIdOnCancelling = NO; resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:<your file path>]; OSSTask * resumeTask = [client resumableUpload:resumableUpload]; [resumeTask continueWithBlock:^id(OSSTask *task) { if (task.error) { NSLog(@"error: %@", task.error); if ([task.error.domain isEqualToString:OSSClientErrorDomain] && task.error.code == OSSClientErrorCodeCannotResumeUpload) { // This task cannot be resumed. You must obtain a new uploadId to re-upload the file. } } else { NSLog(@"Upload file success"); } return nil; }]; // [resumeTask waitUntilFinished]; // [resumableUpload cancel];