【问题标题】:Delete amazon s3 object by versionId using rest API使用rest API按versionId删除amazon s3对象
【发布时间】:2014-04-16 01:39:47
【问题描述】:

我正在尝试使用 REST API 删除 amazon s3 对象,但没有成功。我已经使用 java 在服务器端创建了 URL(签名 url),然后在客户端(即从浏览器)向该 URL 发出 XHR 请求。

我用来签署 url 的 Java 代码:

    public static String getSignedURL(String fileName, int fileOwnerId, String versionId){
    Date expiration = new Date();
    long milliSeconds = expiration.getTime();
    milliSeconds += 1000 * 60 * 10; // Add 10 minutes.
    long seconds = (milliSeconds)/1000L;
    String URL = null;

    try {
        String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
        String canonicalizedResource = "/"+AWS_BUCKET_NAME+"/" + fileOwnerId + "/" + encodedFileName;
        String stringToSign = "DELETE\n\n\n" + seconds + "\n" + canonicalizedResource +"?versionId="+versionId;
        byte[] keyBytes = AWS_SECRET_API_KEY.getBytes();
        SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");

        Mac mac = Mac.getInstance("HmacSHA1");
        mac.init(signingKey);

        byte[] digest = mac.doFinal(stringToSign.getBytes());
        byte[] base64bytes = Base64.encodeBase64(digest);
        String signedString = new String(base64bytes, "UTF-8");

        String signature = URLEncoder.encode(signedString, "UTF-8");

        URL = "https://"+AWS_BUCKET_NAME+".s3.amazonaws.com/" + fileOwnerId +
                "/" + encodedFileName +"?versionId="+versionId +"&Expires=" + seconds+"&AWSAccessKeyId=" +
                AWS_ACCESS_KEY + "&Signature=" + signature;
    } catch (UnsupportedEncodingException ex) {
        Logger.getLogger(Utilities.class.getName()).log(Level.SEVERE, null, ex);
    } catch (NoSuchAlgorithmException nsae) {

    } catch (InvalidKeyException ike) {

    }

    System.out.println("URL IS :"+URL);
    return URL;
}

在客户端:

    var xhr = new XMLHttpRequest();

    xhr.addEventListener("load", deleteComplete, false);

    xhr.open('DELETE', URL_GENERATED_FROM_SERVER, true); 

    xhr.setRequestHeader ("Access-Control-Allow-Origin", "*");

    xhr.send();

通过将“DELETE”请求替换为“GET”,使用此代码从 amazon s3 存储桶下载对象可以正常工作。但删除不起作用。我进行了很多搜索,但对于 REST API 的帮助非常少。

【问题讨论】:

  • 为什么要将 fileOwnerId 添加到 stringToSign?
  • 感谢您的回复@okwap。我添加了这一点,因为这就是我在 s3 上保存文件的方式。比如bucketname/username/file.txt

标签: java rest amazon-web-services amazon-s3 amazon


【解决方案1】:

最后,我集成了 aws sdk 以从 amazon s3 存储桶中删除对象,它就像闪电一样工作。但无法通过 REST API 获得帮助。所以现在我使用了rest API来上传和下载,使用sdk来删除一个对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-10
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 2014-01-09
    相关资源
    最近更新 更多