Загрузка файла на Amazon S3 URL с Android? - PullRequest
0 голосов
/ 18 апреля 2019

Мне нужно загрузить файл на сервер Amazon S3 с "Content-Type", "application/octet-stream" в качестве запроса PUT

Я пытаюсь сделать это с помощью следующего кода, но получаю неверный запрос

 try {
        URL url = new URL(urlString);
        URLConnection uc = url.openConnection();
        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setRequestMethod("PUT");
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setRequestProperty("Content-Type", "application/octet-stream");
        connection.setDoOutput(true);
        connection.connect();

        FileInputStream is = new FileInputStream(sourceFile);
        OutputStream os = connection.getOutputStream();
        byte[] buffer = new byte[4096];
        int bytes_read;
        while ((bytes_read = is.read(buffer)) != -1) {
            os.write(buffer, 0, bytes_read);
        }

        os.flush();
        os.close();
        connection.getResponseCode();

        System.out.println("HTTP response code: " + connection.getResponseCode());
        System.out.println("HTTP response error: " + connection.getResponseMessage());
        return true;
    } catch (IOException e) {
        e.printStackTrace();
        return false;

    }

Я получаю код ответа

HTTP response code: 400
HTTP response error: Bad Request

Что не так с этим кодом?

Код на стороне сервера правильный, так как я могу загрузить сообщение от почтальона.

1 Ответ

0 голосов
/ 18 апреля 2019

Я нашел это в официальной документации Amazon AWS, используя aws-s3-sdk:

import java.io.File;
import java.io.IOException;

import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;

public class UploadObject {

    public static void main(String[] args) throws IOException {
        String clientRegion = "*** Client region ***";
        String bucketName = "*** Bucket name ***";
        String stringObjKeyName = "*** String object key name ***";
        String fileObjKeyName = "*** File object key name ***";
        String fileName = "*** Path to file to upload ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withRegion(clientRegion)
                    .withCredentials(new ProfileCredentialsProvider())
                    .build();

            // Upload a text string as a new object.
            s3Client.putObject(bucketName, stringObjKeyName, "Uploaded String Object");

            // Upload a file as a new object with ContentType and title specified.
            PutObjectRequest request = new PutObjectRequest(bucketName, fileObjKeyName, new File(fileName));
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentType("plain/text");
            metadata.addUserMetadata("x-amz-meta-title", "someTitle");
            request.setMetadata(metadata);
            s3Client.putObject(request);
        }
        catch(AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process 
            // it, so it returned an error response.
            e.printStackTrace();
        }
        catch(SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}

Обратите внимание, что вам нужно добавить зависимости в ваш build.gradle: https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/setup-project-gradle.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...