2016-06-21 17 views
1

Ich versuche, eine Datei mit einer benutzerdefinierten URL in Retrofit hochladen.Hochladen von Image auf Amazon s3 Retrofitfehler: Timeout

Hier ist, wie ich die requestBody mache:

RequestBody fileBody = RequestBody.create(MediaType.parse(artifactHeaders.getContentType()), file); 

Hier ist die Schnittstelle:

@PUT 
Call<ResponseBody> uploadArtifactToAmazon2(@Url String artifactUrl, 
              @Header("Content-Disposition") String contentDisposition, 
              @Header("x-amz-server-side-encryption") String xAmzServerSideEncryption, 
              @Header("x-amz-security-token") String xAmzSecurityToken, 
              @Header("Content-Type") String contentType, 
              @Body RequestBody requestBody); 

Aber ich bin immer auf meinem log:

06-21 10:41:16.354 4760-4808/ 
D/OkHttp: 4�IDATx�<�g�dYv��������j7��cvf�c�5XR����!�06-21 10:41:16.354 4760-4808/D/OkHttp: E�R($�B����"()��D��.�avfz�{zf�Ww�̪J��|/��"������|ޖ�9�?9���Ȧʰ��uv���V��� 
06-21 10:41:16.504 4760-4808/D/OkHttp: �R>a1�~�`.�>����IOhQS�a�B>��=h0 
    [- - - HUNDREDS OF THESE LINES CONTINUE ] 
06-21 10:41:16.567 4760-4808/D/OkHttp: Content-Type: image/png 
06-21 10:41:16.567 4760-4808/D/OkHttp: Content-Length: 669719 

Nach ein paar Sekunden das Log gibt mir das:

06-21 10:41:16.626 4760-4808/D/!!!: Cookie Name: __cfduid Cookie Value: df052a1723cd06647966e629e113d4a461466515894 Expiry: Wed, 21-Jun-2017 14:41:14 GMT+00:00 
06-21 10:41:28.040 4760-4808/D/!!!: Cookie Name: __cfduid Cookie Value: df052a1723cd06647966e629e113d4a461466515894 Expiry: Wed, 21-Jun-2017 14:41:26 GMT+00:00 
06-21 10:41:39.014 4760-4760/D/!!!: Failure Code: timeout 

Bekomme ich das Bild zurück? Was ist los mit dir?

+1

Können Sie uns Ihren Logging-Code zeigen, damit wir die Quelle dieser Zeilen sehen können? Und ich an einer Randnotiz..Ich würde sehr empfehlen, die AWS Android-Lib zu verwenden, um auf S3 zu aktualisieren ... Ich habe früher Retrofit verwendet, um Dateien auch in S3 hochzuladen, aber war nicht von der Leistung beeindruckt. Ihre Lib ist optimiert und verwendet multipart, ohne dass Sie es selbst einrichten müssen. – snkashis

+0

@snkashis Ich denke ernsthaft über die Verwendung der AWS Android-Lib, aber die Anmeldeinformationen müssen verwenden, stammt aus unserer REST-API und es wird mehr Größe der App hinzufügen. Ich werde mehr Protokolle veröffentlichen. –

+0

Ich hatte einige der gleichen Bedenken, aber die Geschwindigkeitssteigerung war signifikant genug, um es zu rechtfertigen (vielleicht sind Ihre Uploads nicht so groß?). Ihre REST-API kann Cognito-Credentials bereitstellen, die der Transfermanager verwendet. – snkashis

Antwort

0

Schließlich löste dies. Es stellt sich heraus, dass Retrofit standardmäßig 10 Sek. Hat. Timeout (siehe Details here).

Dies unterbricht oder stoppt das Hochladen beim Nachrüsten.

Die Zeichen, die ich in meinem Protokoll sehe (ich verwende HttpLoggingInterceptor.Level.BODY). Die Lösung ist die Timeout-Dauer einzustellen:

httpClient.readTimeout(10, TimeUnit.MINUTES) 
      .connectTimeout(10, TimeUnit.MINUTES) 

Meine nächste Aufgabe sein würde entweder zu bestimmen, wie lange es für die Datei nehmen, dass hochgeladen werden und mit Hilfe der Timeout-Dauer einzustellen und das Timeout-Ereignis korrekt zu verarbeiten.