2017-12-13 19 views
1

azure server.Itで10-11 MBのビデオファイルをアップロードしようとしています。これは4gまたはwifiネットワーク上で正常に動作します。しかし、3gまたは2gネットワーク。遅いネットワークでAzureサーバーでビデオファイルをアップロードすると

java.io.IOException:クライアントは、指定された最大実行タイムアウト 以内に操作を完了できませんでした。

try { 
      // Setup the cloud storage account. 
      CloudStorageAccount account = CloudStorageAccount 
        .parse("somestring"); 

      // Create a blob service client 
      CloudBlobClient blobClient = account.createCloudBlobClient(); 
      BlobRequestOptions uploadOptions = new BlobRequestOptions(); 
      uploadOptions.setMaximumExecutionTimeInMs(300000); 
      uploadOptions.setTimeoutIntervalInMs(100000); 
      RetryPolicy retryPolicy=new RetryExponentialRetry(
        60000 /* minBackoff in milliseconds */, 
        30000 /* delatBackoff in milliseconds */, 
        180000 /* maxBackoff in milliseconds */, 
        3 /* maxAttempts */); 
      uploadOptions.setRetryPolicyFactory(retryPolicy); 
      // Get a reference to a container 
      // The container name must be lower case 
      // Append a random UUID to the end of the container name so that 
      // this sample can be run more than once in quick succession. 
      CloudBlobContainer container = blobClient.getContainerReference("videos"); 

      // Create the container if it does not exist 
      container.createIfNotExists(); 

      // Make the container public 
      // Create a permissions object 
      BlobContainerPermissions containerPermissions = new BlobContainerPermissions(); 
      OperationContext opContext = new OperationContext(); 
      StorageEventMultiCaster storageEventMultiCaster = new StorageEventMultiCaster<>(); 

      // Include public access in the permissions object 
      containerPermissions 
        .setPublicAccess(BlobContainerPublicAccessType.CONTAINER); 
      storageEventMultiCaster.addListener(new StorageEvent<SendingRequestEvent>() { 

       @Override 
       public void eventOccurred(SendingRequestEvent eventArg) { 

        // Do custom monitoring here... 
       } 
      }); 
      opContext.setSendingRequestEventHandler(storageEventMultiCaster); 
      // Set the permissions on the container 
      container.uploadPermissions(containerPermissions); 
      CloudBlockBlob blob = container.getBlockBlobReference(file.getName()); 

      byte[] buffer = IOUtils.toByteArray(new FileInputStream(file)); 
      ByteArrayInputStream inputStream = new ByteArrayInputStream(buffer); 
      blob.upload(inputStream, inputStream.available(),null,uploadOptions,opContext); 
      inputStream.close(); 
      String url = blob.getUri().toString(); 
        } catch (Throwable t) { 

     } 

私はcom.microsoft.azure.android:azure-storage-android:[email protected]ライブラリを使用しています - :

以下

が私のコード..です 更なる情報については、原因を参照してください。

ご協力いただければ幸いです。

答えて

1

BlobRequestOptionsは、アップロード中にブロブをブロック分割する必要があるかどうかを決定するプロパティーsingleBlobPutThresholdInBytesを持っています。値を指定しない場合、デフォルト値は32 MBです。つまり、アップロードされているファイルのサイズが32 MB未満の場合は、ブロックに分割せずにアップロードされます。

ファイルサイズがこの32 MBの制限よりも小さい10-11 MBであると述べたので、SDKはワンショットでファイルをアップロードしようとしています。インターネット接続が遅いため、この巨大なデータをアップロードしようとするとタイムアウトしてしまいます。

あなたができることは、値を小さなサイズに変更することです。値は1 MB以上32 MB未満でなければなりません。その後、ファイルがチャンクにアップロードされ、このタイムアウトエラーが発生しないようにしてください(うまくいけば)。値を設定するには、次のコード行を追加することができます:あなたのanswer.Nowあちこち

uploadOptions.setSingleBlobPutThresholdInBytes(1024*1024);//1MB 
+0

感謝を私はエラー.'java.lang.IllegalArgumentExceptionを取得しています:引数が範囲外です。引数名:singleBlobPutThresholdInBytes、渡される値:262144. – Soham

+0

申し訳ありません...私の悪い。コードに基づいて、値は1MBから32 MBの間でなければなりません(1 MBのこの制限がなぜ配置されているかわかりません)。 1MBを指定してみてください。 [参照:https://github.com/Azure/azure-storage-android/blob/ba03f63070ea0b5affb121203142e37d6dcb311c/microsoft-azure-storage/src/com/microsoft/azure/storage/blob/BlobRequestOptions.java#L361] –

+0

私は再試行します。 – Soham