Кодовое имя 1. Загрузка изображения в корзину S3

Я пытаюсь загрузить изображение в свою корзину s3 в своем проекте codenameone согласно ветке ниже:

Кодовое имя: разрешение на загрузку изображения в корзину S3

Но не в состоянии это сделать. Получение кода ошибки соединения 301 и java.lang.NullPointerException...

Чтобы убедиться, что мои конфигурации корзины s3 верны, я успешно загрузил изображение с помощью приложения Postman и Javascript SDK.

Я хотел бы понять, требует ли приведенный выше пример каких-либо дополнительных учетных данных, таких как AccessKey, SecretKey и регион AWS? Если да, пожалуйста, руководствуйтесь тем же.

Ваша помощь очень ценится.

Спасибо

Ниже мой код.

пытаться {

        String strImage = Capture.capturePhoto(300, -1);             
        String s3Bucket = "https://s3.amazonaws.com/mybucketname/";
        String fileName = "testimg1.jpg";
        
        MultipartRequest request = new MultipartRequest();
        request.setUrl(s3Bucket);            
        request.addRequestHeader("Content-Type", "image/jpeg");
        request.addArgumentNoEncoding("key", fileName);            
        request.addArgument("acl", "bucket-owner-full-control");
        request.addData("file", strImage, "image/jpeg");            
        NetworkManager.getInstance().addToQueueAndWait(request);
                 
        int http_code = request.getResponseCode();
        
        Dialog.show("Ok", String.valueOf( http_code) , "Ok", null);      
        
    } catch (Exception ex) {
        
        String err = ex.toString();
        Dialog.show("Err", err, "Ok", null);
    }

Консоль Netbeans показывает ошибку ниже.

java.lang.NullPointerException в com.codename1.io.ConnectionRequest.performOperationComplete(ConnectionRequest.java:935) в com.codename1.io.NetworkManager$NetworkThread.runCurrentRequest(NetworkManager.java:314) в com.codename1.io.NetworkManager$NetworkThread.run(NetworkManager.java:390) в com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176) [Сетевой поток] 0:0:6,656 — Исключение: java.io.IOException — Поток закрыт java.io.IOException: поток закрыт в com.codename1.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:140) в com.codename1.io.BufferedInputStream.read1 (BufferedInputStream.java:338) в com.codename1.io.BufferedInputStream.read(BufferedInputStream.java:445) в com.codename1.io.BufferedInputStream.read(BufferedInputStream.java:668) в com.codename1.io.Util.copyNoClose(Util.java:149) в com.codename1.io.Util.copyNoClose(Util.java:135) по адресу com.codename1.io.Util.copy(Util.java:170) по адресу com.codename1.io.Util.copy(Util.java:124) в com.codename1.io.Util.readInputStream(Util.java:303) в com.codename1.io.ConnectionRequest.readResponse(ConnectionRequest.java:1543) в com.codename1.io.ConnectionRequest.performOperationComplete(ConnectionRequest.java:1003) в com.codename1.io.NetworkManager$NetworkThread.runCurrentRequest(NetworkManager.java:314) в com.codename1.io.NetworkManager$NetworkThread.run(NetworkManager.java:390) в com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)

Странно. Судя по коду, похоже, что вы получили перенаправление 301 или 302 без установленного заголовка местоположения. В почтальоне вы получаете перенаправление, и если да, то какой код ответа сервера и какие заголовки?

Shai Almog 06.10.2023 04:46

В почтальоне я не получаю никаких ошибок перенаправления.

user22676753 06.10.2023 06:32

Ниже приведен мой запрос на завиток от почтальона. Где я установил Auth >> Type: Подпись AWS. И предоставьте информацию о ключе доступа, секретном ключе, регионе, сервисе и т. д. image/jpeg' \ --header 'X-Amz-Content-Sha256: xxxxxx' \ --header 'X-Amz-Date: 20231006T041844Z' \ --header 'Авторизация: AWS4-HMAC-SHA256 Credential=xxx/20231006/ ap-xx-1/s3/aws4_request, SignedHeaders=длина-контента;тип-контента;хост;x-amz-content‌​-sha256;x-amz-date, Signature=xxxxx' \ --data '@/C: /Temp/TempImg.jpg'

user22676753 06.10.2023 14:59

В коде завитка у вас есть 'https ://my-bucket.s3.amazonaws.com/test1.jpg, а здесь https://s3.amazonaws.com/mybucketname/. Таким образом, код Curl не будет идентичен коду почтальона.

Shai Almog 07.10.2023 04:17

Можете ли вы помочь, как решить одну проблему с моим кодовым именем? Я не могу понять, что не так в моем кодовом имени.

user22676753 07.10.2023 06:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
90
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Для справки, это оператор Curl:

curl --location --request PUT 'https ://my-bucket.s3.amazonaws.com/test1.jpg' \ --header 'Content-Type: image/jpeg' \ --header 'X-Amz-Content-Sha256: xxxxxx' \ --header 'X-Amz-Date: 20231006T041844Z' \ --header 'Authorization: AWS4-HMAC-SHA256 Credential=xxx/20231006/ap-xx-1/s3/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-content-sha256;x-amz-date, Signature=xxxxx' \ --data '@/C:/Temp/TempImg.jpg' 

Это должен быть эквивалентный код Codename One:

Response<String> result = Rest.put("https ://my-bucket.s3.amazonaws.com/test1.jpg")
   .contentType("image/jpeg")
   .header("X-Amz-Content-Sha256", "xxxxxx")
   .header("X-Amz-Date", "20231006T041844Z")
   .header("Authorization", "AWS4-HMAC-SHA256 Credential=xxx/20231006/ap-xx-1/s3/aws4_request,SignedHeaders=content-length;content-type;host;x-amz-content-sha256;x-amz-date, Signature=xxxxx")
   .body(new Data.ByteData(contentOfFile)).getAsString();

Привет, Шай, мне не хватает какой-либо конфигурации? Не могли бы вы подсказать мне, нужно ли мне выполнить какие-либо настройки в ASW S3 или в конце проекта под кодовым названием? Мы уже давно используем codenameone для мобильного приложения для Android. Теперь мы находимся в ситуации, когда нам нужно выполнить требование нашего клиента о загрузке изображения (строго щелчком камеры) из мобильного приложения в корзину s3. Пожалуйста, пожалуйста, предложите что-нибудь. Спасибо

user22676753 08.10.2023 20:12

Я не уверен, что следую. Если команда Curl работает автономно, то этот вызов API должен быть ее общим эквивалентом и не требовать дополнительной настройки. Если возникла проблема, вы можете использовать инструмент сетевого монитора и просмотреть ошибки, которые вы получаете от AWS. Это можно использовать для отладки такой проблемы.

Shai Almog 09.10.2023 04:42

Однако команда Curl Postman не работает сама по себе. Я ищу решение под кодовым названием один, как указано в моей формулировке проблемы. Мне любопытно, как это делают другие пользователи под кодовым именем. Я упомянул пример почтальона только для того, чтобы убедиться, что мое ведро создано успешно, и я могу загружать файлы из почтальона, а также из Javascript SDK. Меня больше интересует одно решение под кодовым названием. т. е. String s3Bucket = "s3.amazonaws.com/mybucketname"; String fileName = "testimg1.jpg"; Запрос MultipartRequest = новый MultipartRequest(); request.setUrl(s3Bucket);

user22676753 09.10.2023 04:57

ХОРОШО. Поэтому, если он не работает автономно, возможно, проблема связана с конфигурацией S3. Это другое решение работает за счет наличия всемирной записываемой корзины, а не идеального решения. Основная проблема — аутентификация/авторизация в S3. Если вы создадите записываемую корзину, исходный код должен работать нормально.

Shai Almog 10.10.2023 04:55

Хорошо. Будет проверено. Спасибо.

user22676753 10.10.2023 13:18

Спасибо, Шай. Это работает, когда я делаю mybucket полностью общедоступным. Но, как вы сказали, это нецелесообразно. Можете ли вы предложить другой способ предоставления учетных данных моего корзины, например AccessKey и SecretKey?

user22676753 10.10.2023 15:54

Лично я это не пробовал, поэтому не могу сказать точно. Если вы посмотрите на код, который я привел выше, он требует значений, которые явно генерируются в процессе авторизации. Я не уверен, как они генерируются для AWS, но, вероятно, их можно создать и здесь.

Shai Almog 11.10.2023 14:10

Хорошо. Большое вам спасибо за всю помощь. Теперь, по крайней мере, у меня есть готовое одно из решений.

user22676753 11.10.2023 18:19
Ответ принят как подходящий

По предложению Шаи я сделал свое ведро общедоступным, после чего приведенный выше код начал работать с кодовым именем один.

Внес 2 изменения в код,

Теперь URL-адрес «https://mybucketname.s3.amazonaws.com/»;

И использовал метод «PUT» объекта запроса.

Спасибо Шай за всю помощь.

Другие вопросы по теме