Android - загрузка изображения в S3 без использования других AWS инструментов, таких как усиление - PullRequest
0 голосов
/ 04 апреля 2020

Я создаю свое первое android приложение, и одна из функций, которые я хочу создать, - это сделать снимок с помощью камеры и загрузить его.

Фотосъемка работает отлично. Я столкнулся с проблемой при загрузке изображений. Ниже приведен код:

public void uploadFileToS3() {
        String ACCESS_KEY = "XXX";
        String SECRET_KEY = "AAAAAAAA";
        String MY_BUCKET = "abcede";
        AmazonS3 s3 = new AmazonS3Client( new BasicAWSCredentials( ACCESS_KEY, SECRET_KEY ) );
        java.security.Security.setProperty( "networkaddress.cache.ttl", "60" );
        s3.setRegion( Region.getRegion( Regions.AP_SOUTH_1 ) );
        s3.setEndpoint( "https://s3-ap-southeast-1.amazonaws.com/" );
        TransferUtility transferUtility = new TransferUtility( s3, getApplicationContext() );
        File storageDir = getExternalFilesDir( DIRECTORY_PICTURES );
        String path = getExternalFilesDir( DIRECTORY_PICTURES ).getAbsolutePath();
        String[] files = storageDir.list();
        int fileCount = storageDir.listFiles().length;
        // Log.i("File count: ", Integer.toString(fileCount));
        // Log.i("Path :", path);
        // if (fileCount > 0) {
        //     Log.i("Images :", Arrays.toString(files));
        // }
       if (fileCount > 0) {
           for (int i = 0; i <= fileCount; i++) {
               String file = files[i];
               File uploadToS3 = new File( path );
               TransferObserver transferObserver = transferUtility.upload( MY_BUCKET, file, uploadToS3 );
               transferObserver.setTransferListener( new TransferListener() {
                   @Override
                   public void onStateChanged(int id, TransferState state) {
                       Toast.makeText( getApplicationContext(), "State Change:" + state, Toast.LENGTH_SHORT ).show();
                   }

                   @Override
                   public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) {
                       int percentage = (int) (bytesCurrent / bytesTotal * 100);
                       Toast.makeText( getApplicationContext(), "Upload Status : " + percentage + "%", Toast.LENGTH_SHORT ).show();
                   }

                   @Override
                   public void onError(int id, Exception ex) {
                       Log.e( "error", "error" );
                   }
               } );
           }
       }
    }

Строки, которые я закомментировал, отображают правильное количество файлов, имен файлов и т. Д. c. указывая на изображения есть в пути. Но загрузка не удалась.

Вывод Log.i приведен ниже:

2020-04-04 17:09:27.271 10393-10393/com.example.syncsqlite I/Images :: [ra_surf_sureshentp_ShelfParasite_20200404_163437_1893453067.jpg, ra_surf_sureshentp_ShelfParasite_20200404_164914_264777191.jpg, ra_surf_sureshentp_ShelfStrip_20200404_164927_776603691.jpg, ra_surf_sureshentp_ShelfParasite_20200404_165322_1281651413.jpg, ra_surf_sureshentp_ShelfStrip_20200404_165334_1705528733.jpg, ra_surf_sureshentp_ShelfParasite_20200404_170004_1323441500.jpg, ra_surf_sureshentp_ShelfStrip_20200404_170014_80431959.jpg]

2020-04-04 17:14:12.620 10526-10526/com.example.syncsqlite I/Path :: /storage/emulated/0/Android/data/com.example.syncsqlite/files/Pictures

2020-04-04 17:14:12.620 10526-10526/com.example.syncsqlite I/File count:: 7

Но я не могу загрузить изображения, и программа завершается с ошибкой:

java.lang.ArrayIndexOutOfBoundsException: length=7; index=7

        at com.example.syncsqlite.welcome.uploadFileToS3(welcome.java:377)

Строка 377 обозначает эту строку:

String file = files[i];

1 Ответ

1 голос
/ 04 апреля 2020

Заменить:

for (int i = 0; i <= fileCount; i++)

на:

for (int i = 0; i < fileCount; i++)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...