Как загрузить файл на предварительно подписанный URL-адрес в AWS с помощью Java? - PullRequest
0 голосов
/ 11 октября 2018
URL url = new URL("https://prod-us-west-2-uploads.s3-us-west-2.amazonaws.com/arn%3Aaws%3Adevicefarm%3Aus-west-2%3A225178842088%3Aproject%3A1e6bbc52-5070-4505-b4aa-592d5e807b15/uploads/arn%3Aaws%3Adevicefarm%3Aus-west-2%3A225178842088%3Aupload%3A1e6bbc52-5070-4505-b4aa-592d5e807b15/501fdfee-877b-42b7-b180-de584309a082/Hamza-test-app.apk?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20181011T092801Z&X-Amz-SignedHeaders=host&X-Amz-Expires=86400&X-Amz-Credential=AKIAJSORV74ENYFBITRQ%2F20181011%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Signature=f041f2bf43eca1ba993fbf7185ad8bcb8eccec8429f2877bc32ab22a761fa2a");
        File file = new File("C:\\Users\\Hamza\\Desktop\\Hamza-test-app.apk");
        //Create Connection
        HttpURLConnection connection =  (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("PUT");
        BufferedOutputStream bos = new BufferedOutputStream(connection.getOutputStream());
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        int i;
        // read byte by byte until end of stream
        while ((i = bis.read()) > 0) {
    bos.write(i);
        }
        bos.flush();
        bis.close();
        bos.close();


        System.out.println("HTTP response code: " + connection.getResponseCode());
    }catch(Exception ex){
        System.out.println("Failed to Upload File");
    }

Я хочу загрузить файл на устройства фермы AWS в Java, но файл не загружается в список загрузки проекта AWS.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

В качестве пояснения к моему более позднему комментарию приведены два примера загрузки по предварительно подписанному URL-адресу, возвращенному SDK Device Farm в Java.

Пример плагина Jenkins

Общий пример документации s3 о предварительно назначенных URL-адресах

[update]

Здесьпример загрузки файла на предварительно назначенный URL-адрес фермы устройств s3:

package com.jmp.stackoveflow;

import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;

import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSSessionCredentials;
import com.amazonaws.auth.STSAssumeRoleSessionCredentialsProvider;
import com.amazonaws.services.devicefarm.*;
import com.amazonaws.services.devicefarm.model.CreateUploadRequest;
import com.amazonaws.services.devicefarm.model.Upload;

import org.apache.commons.lang3.RandomStringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.FileEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class App {

    public static void main(String[] args) {
        String PROJECT_ARN = "arn:aws:devicefarm:us-west-2:111122223333:project:ffb3d9f2-3dd6-4ab8-93fd-bbb6be67b29b";
        String ROLE_ARN = "arn:aws:iam::111122223333:role/DeviceFarm_FULL_ACCESS";

        System.out.println("Creating credentials object");
        // gettting credentials
        STSAssumeRoleSessionCredentialsProvider sts = new STSAssumeRoleSessionCredentialsProvider.Builder(ROLE_ARN,
                RandomStringUtils.randomAlphanumeric(8)).build();
        AWSSessionCredentials creds = sts.getCredentials();
        ClientConfiguration clientConfiguration = new ClientConfiguration()
                .withUserAgent("AWS Device Farm - stackoverflow example");
        AWSDeviceFarmClient api = new AWSDeviceFarmClient(creds, clientConfiguration);
        api.setServiceNameIntern("devicefarm");

        System.out.println("Creating upload object");

        File app_debug_apk = new File(
                "PATH_TO_YOUR_FILE_HERE");
        FileEntity fileEntity = new FileEntity(app_debug_apk);

        CreateUploadRequest appUploadRequest = new CreateUploadRequest().withName(app_debug_apk.getName())
                .withProjectArn(PROJECT_ARN).withContentType("application/octet-stream").withType("ANDROID_APP");
        Upload upload = api.createUpload(appUploadRequest).getUpload();

        // Create the connection and use it to upload the new object using the
        // pre-signed URL.
        CloseableHttpClient httpClient = HttpClients.createSystem();
        HttpPut httpPut = new HttpPut(upload.getUrl());
        httpPut.setHeader("Content-Type", upload.getContentType());
        httpPut.setEntity(fileEntity);
        try {
            HttpResponse response = httpClient.execute(httpPut);
            System.out.println("Response: "+ response.getStatusLine().getStatusCode());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

OUTPUT

Creating credentials object
Creating upload object
Response: 200
0 голосов
/ 11 октября 2018

Вы должны использовать AWS SDK, как показано здесь

...