如何使用Java将文件上传到AWS中的预签名URL?

时间:2018-10-11 09:47:04

标签: java amazon-web-services amazon-s3 aws-lambda aws-java-sdk

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");
    }

我想用Java将文件上传到AWS Farm设备,但文件没有上传到AWS项目上传列表。

3 个答案:

答案 0 :(得分:0)

仅在后面详述我的评论,这里有两个示例,这些示例如何上传到Java中Device Farm的SDK返回的预签名URL。

Jenkins plugin example

Generic s3 documentation example about presigned urls

        // Create the connection and use it to upload the new object using the pre-signed URL.
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("PUT");
        OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
        out.write("This text uploaded as an object via presigned URL.");
        out.close();

        // Check the HTTP response code. To complete the upload and make the object available, 
        // you must interact with the connection object in some way.
        connection.getResponseCode();
        System.out.println("HTTP response code: " + connection.getResponseCode());

答案 1 :(得分:0)

这是一个古老的问题。万一其他人找到这个。这是我解决小于5mb的文件的问题的方法。对于超过5mb的文件,建议使用分段上传。 注意:使用Java的“尝试资源”很方便。 Try Catch使此操作笨拙,但可确保在方法内以最少的代码量关闭资源。

/**
 * Serial upload of an array of media files to S3 using a presignedUrl.
 */
public void serialPutMedia(ArrayList<String> signedUrls) {
        long getTime = System.currentTimeMillis();
        LOGGER.debug("serialPutMedia called");

        String toDiskDir = DirectoryMgr.getMediaPath('M');

        try {
            HttpURLConnection connection;
            for (int i = 0; i < signedUrls.size(); i++) {
                URL url = new URL(signedUrls.get(i));
                connection = (HttpURLConnection) url.openConnection();
                connection.setDoOutput(true);
                connection.setRequestMethod("PUT");
                localURL = toDiskDir + "/" + fileNames.get(i);
                try (BufferedInputStream bin = new BufferedInputStream(new FileInputStream(new File(localURL)));
                     ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(connection.getOutputStream())))  
                {
                    LOGGER.debug("S3put request built ... sending to s3...");
                    
                    byte[] readBuffArr = new byte[4096];
                    int readBytes = 0;
                    while ((readBytes = bin.read(readBuffArr)) >= 0) {
                        out.write(readBuffArr, 0, readBytes);
                    }
                    connection.getResponseCode();
                    LOGGER.debug("response code: {}", connection.getResponseCode());

                } catch (FileNotFoundException e) {
                    LOGGER.warn("\tFile Not Found exception");
                    LOGGER.warn(e.getMessage());
                    e.printStackTrace();
                }
            }

        } catch (MalformedURLException e) {
            LOGGER.warn(e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            LOGGER.warn(e.getMessage());
            e.printStackTrace();
        }
        getTime = (System.currentTimeMillis() - getTime);
        System.out.print("Total get time in syncCloudMediaAction: {" + getTime + "} milliseconds, numElement: {" + signedUrls.size() + "}");
    }

答案 2 :(得分:-1)

您应使用here

所示的AWS开发工具包