Я пытаюсь загрузить изображение в свою корзину 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)
В почтальоне я не получаю никаких ошибок перенаправления.
Ниже приведен мой запрос на завиток от почтальона. Где я установил 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'
В коде завитка у вас есть 'https ://my-bucket.s3.amazonaws.com/test1.jpg, а здесь https://s3.amazonaws.com/mybucketname/. Таким образом, код Curl не будет идентичен коду почтальона.
Можете ли вы помочь, как решить одну проблему с моим кодовым именем? Я не могу понять, что не так в моем кодовом имени.





Я не знаю, почему вы получаете эту ошибку, но я могу написать код, похожий на имеющуюся у вас команду 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. Пожалуйста, пожалуйста, предложите что-нибудь. Спасибо
Я не уверен, что следую. Если команда Curl работает автономно, то этот вызов API должен быть ее общим эквивалентом и не требовать дополнительной настройки. Если возникла проблема, вы можете использовать инструмент сетевого монитора и просмотреть ошибки, которые вы получаете от AWS. Это можно использовать для отладки такой проблемы.
Однако команда Curl Postman не работает сама по себе. Я ищу решение под кодовым названием один, как указано в моей формулировке проблемы. Мне любопытно, как это делают другие пользователи под кодовым именем. Я упомянул пример почтальона только для того, чтобы убедиться, что мое ведро создано успешно, и я могу загружать файлы из почтальона, а также из Javascript SDK. Меня больше интересует одно решение под кодовым названием. т. е. String s3Bucket = "s3.amazonaws.com/mybucketname"; String fileName = "testimg1.jpg"; Запрос MultipartRequest = новый MultipartRequest(); request.setUrl(s3Bucket);
ХОРОШО. Поэтому, если он не работает автономно, возможно, проблема связана с конфигурацией S3. Это другое решение работает за счет наличия всемирной записываемой корзины, а не идеального решения. Основная проблема — аутентификация/авторизация в S3. Если вы создадите записываемую корзину, исходный код должен работать нормально.
Хорошо. Будет проверено. Спасибо.
Спасибо, Шай. Это работает, когда я делаю mybucket полностью общедоступным. Но, как вы сказали, это нецелесообразно. Можете ли вы предложить другой способ предоставления учетных данных моего корзины, например AccessKey и SecretKey?
Лично я это не пробовал, поэтому не могу сказать точно. Если вы посмотрите на код, который я привел выше, он требует значений, которые явно генерируются в процессе авторизации. Я не уверен, как они генерируются для AWS, но, вероятно, их можно создать и здесь.
Хорошо. Большое вам спасибо за всю помощь. Теперь, по крайней мере, у меня есть готовое одно из решений.
По предложению Шаи я сделал свое ведро общедоступным, после чего приведенный выше код начал работать с кодовым именем один.
Внес 2 изменения в код,
Теперь URL-адрес «https://mybucketname.s3.amazonaws.com/»;
И использовал метод «PUT» объекта запроса.
Спасибо Шай за всю помощь.
Странно. Судя по коду, похоже, что вы получили перенаправление 301 или 302 без установленного заголовка местоположения. В почтальоне вы получаете перенаправление, и если да, то какой код ответа сервера и какие заголовки?