파일 업로드를 처리하기 위해 AWS 코어 및 S3 SDK를 구현했습니다. 안타깝게도 가끔 업로드가 제대로 작동하지 않습니다. (WiFi 연결에서만 보이는 것 같지만 그 사실에 대해 100 % 확신 할 수는 없습니다)
알 수없는 이유로 aws 서비스는 파일 업로드가 완료되지 않은 경우에도 성공적인 응답을 수신하고 모든 것이 중단됩니다.
Transfer Service가 시작된 것을 볼 수 있으며, 예를 들어 첫 번째 파일은 제대로 업로드를 시작하고 완료되지만 두 번째 파일은 업로드를 완료하지 않고 TransferService가 전송 리스너를 통해 오류를받지 않고 조용히 중지됩니다. 디버그 로그를 활성화했습니다. AWS에서 자세한 정보를 얻을 수 있는지 확인하려면
java.util.logging.Logger.getLogger("com.amazonaws").setLevel(java.util.logging.Level.FINEST);
그리고 여기에 첫 번째 파일 업로드가 성공하고 두 번째 파일이 실패한 업로드 로그가 있습니다. 첫 번째 파일이 완료되었음을 알리면 다음 파일을 시작합니다. (쉬운 분석을 위해 패키지 이름과 타임 스탬프 제외) :
D/AwsUploadManager: Uploading file: /storage/emulated/0/folder/profile20160219_123233.jpg
D/AwsUploadManager: Uploading under key: 56cb00d2121bbfcc0e8c68e7-843f1417-3f44-4d76-915d-f3a72c56a7d4
D/AwsUploadManager: AwsUploadManager 56cb00d2121bbfcc0e8c68e7-843f1417-3f44-4d76-915d-f3a72c56a7d4
D/TransferSerivce: Starting Transfer Service
D/TransferSerivce: Loading transfers from database
D/TransferSerivce: 1 transfers are loaded from database
W/TransferSerivce: Transfer has already been added: 6
D/TransferSerivce: Network connected: true
D/AwsUploadManager: onStateChanged IN_PROGRESS
D/AwsUploadManager: onProgressChanged id= 6 ::bytesCurrent0 bytesTotal16917
D/com.amazonaws.request: Sending Request: PUT.........
D/libc: [NET] android_getaddrinfofornet+,hn 41(0x6369616f2d696d),sn(),hints(known),family 0,flags 4
D/libc: [NET] android_getaddrinfofornet-, err=8
D/libc: [NET] android_getaddrinfofornet+,hn 41(0x6369616f2d696d),sn(),hints(known),family 0,flags 1024
D/libc: [NET] android_getaddrinfofornet-, pass to proxy
D/libc: [NET] android_getaddrinfo_proxy+
D/libc: [NET] android_getaddrinfo_proxy get netid:0
D/libc: [NET] android_getaddrinfo_proxy-, success
D/AwsUploadManager: onProgressChanged id= 6 ::bytesCurrent16917 bytesTotal16917
D/com.amazonaws.request: Received successful response: 200, AWS Request ID: 85952ED0E0FCF444
D/AwsUploadManager: onProgressChanged id= 6 ::bytesCurrent16917 bytesTotal16917
D/AwsUploadManager: onStateChanged COMPLETED
D/AwsUploadManager: Upload finished: 56cb00d2121bbfcc0e8c68e7-843f1417-3f44-4d76-915d-f3a72c56a7d4
D/AwsUploadManager: Uploaded url: https://server-name.s3.eu-central-1.amazonaws.com/56cb00d2121bbfcc0e8c68e7-843f1417-3f44-4d76-915d-f3a72c56a7d4
D/AwsUploadManager: Uploading file: /storage/emulated/0/folder/profile20160219_122512.jpg
D/AwsUploadManager: Uploading under key: 56cb00d2121bbfcc0e8c68e7-7ea27f9e-0e48-4fde-81a1-7d72383ada2d
D/AwsUploadManager: AwsUploadManager 56cb00d2121bbfcc0e8c68e7-7ea27f9e-0e48-4fde-81a1-7d72383ada2d
D/AwsUploadManager: onStateChanged IN_PROGRESS
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent0 bytesTotal1930575
D/com.amazonaws.request: Sending Request: PUT https://server-name.s3.eu-central-1.amazonaws.com /56cb00d2121bbfcc0e8c68e7-7ea27f9e-0e48-4fde-81a1-7d72383ada2d Headers: (x-amz-decoded-content-length: 1930575, Content-MD5....
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent655360 bytesTotal1930575
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent1048576 bytesTotal1930575
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent1310720 bytesTotal1930575
D/AwsUploadManager: onProgressChanged id= 7 ::bytesCurrent1703936 bytesTotal1930575
D/com.amazonaws.request: Received successful response: 200, AWS Request ID: DE9670A8450D4BAB
**D/TransferSerivce: Stop self** --And here amazon stopped self without notifying registered listeners about transfer..
업로드를 호출하는 데 사용되는 코드 :
TransferObserver transferObserver = mTransferUtility.upload(BUCKET_NAME, fileKey, file);
transferObserver.setTransferListener(new TransferListener() {...}
Cognito 풀 대신 pub / sec 키 자격 증명과 함께 표준 인증 방법을 사용한다는 점을 제외하면 모든 것이 샘플의 표준입니다.
mAwsCredentials = new BasicAWSCredentials(mContext.getString(R.string.aws_accress_key), context.getString(R.string.aws_secret_key));
mAmazonS3Client = new AmazonS3Client(mAwsCredentials);
mAmazonS3Client.setRegion(com.amazonaws.regions.Region.getRegion(REGION));
mTransferUtility = new TransferUtility(mAmazonS3Client, mContext);
Btw이 문제는 때로는 첫 번째 파일 업로드에서 때때로 발생하며 때로는 업로드하려는 파일 수와 관련이 없습니다. 또한 때로는 업로드가 중단되기 전에 onProgressChanged가 한 번만 실행되고 나중에 수신 된 성공적인 응답과 자체 중지를 볼 수 있습니다.
질문 : 이전에이 문제를 경험 한 사람이 있으며 어떤 관련이 있습니까? 나는 이것을 비교적 자주 (2 회마다) 경험하고있어서 네트워크와 관련이 있는지 확실하지 않습니다. 그렇더라도 아마존이 네트워크 오류를 올바르게 처리하거나 적어도 등록 된 리스너에게 알릴 것으로 예상했습니다. 또한 일부 소스 코드를 살펴본 후 문서에서 네트워크 문제를 제대로 처리하고 있다는 느낌을 받았기 때문에 내 편에서 끔찍한 일을하고 있기를 바라고 있습니다.
v2.2.12의 최근 변경 사항은 등록 된 전송 리스너에 대한 약한 참조 만 유지합니다. 사용자는 전송이 완료 될 때까지 전송 리스너를 보유 할 책임이 있습니다. 의도는 메모리 누수를 방지하는 것입니다. 그러나 그 사용법은 명확하게 문서화되어 있지 않습니다. 향후 릴리스에서 조정할 계획입니다. 계속 지켜봐주세요.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다