【问题标题】:Uploading a file via Post Request通过 Post Request 上传文件
【发布时间】:2012-11-22 05:24:59
【问题描述】:

我正在尝试按照他们的documentation 通过 HTTP Post 将图像上传到 SmugMug。我的所有标题都是正确的,但让我感到困惑的部分是按照说明在正文中设置二进制数据:

此方法需要一个 POST 请求,其中包含正文中的二进制数据 以及标题中的所有其他元数据。

我试过了:

  • SMResponse response = builder.post(SMResponse.class, Files.readAllBytes(image.toPath()));
    
  • SMResponse response = builder.post(SMResponse.class, new String(Files.readAllBytes(image.toPath())));
    
  • SMResponse response = builder.post(SMResponse.class, new String(Base64.encode(Files.readAllBytes(image.toPath()))));
    
  • SMResponse response = builder.post(SMResponse.class, Base64.encode(Files.readAllBytes(image.toPath())));
    

我最好的猜测是第一个会起作用,但所有这些都会返回:

{"stat":"fail","method":"smugmug.images.upload","code":5,"message":"system error"}

这是上传的完整方法,以防我错过了什么:

public boolean upload(File image, int albumId, String caption, String keywords, 
        Boolean hidden, Integer imageId, Integer altitude, Float latitude, 
        Float longitude, boolean pretty) throws IOException, InvalidKeyException, NoSuchAlgorithmException, SmugMugException {
    logger.debug("upload() called");
    byte[] imageBytes = Files.readAllBytes(image.toPath());

    WebResource resource = SmugMugAPI.CLIENT.resource("http://upload.smugmug.com/");

    LoggingFilter logFilter = new LoggingFilter();
    resource.addFilter(logFilter);

    OAuthSecrets secrets = new OAuthSecrets().consumerSecret(smugmug.getConsumerSecret());
    OAuthParameters oauthParams = new OAuthParameters().consumerKey(smugmug.getCosumerKey()).
            signatureMethod("HMAC-SHA1").version("1.0");
    // Create the OAuth client filter
    OAuthClientFilter filter = new OAuthClientFilter(SmugMugAPI.CLIENT.getProviders(), oauthParams, secrets);
    // Add the filter to the resource
    if (smugmug.getToken() != null){
        secrets.setTokenSecret(smugmug.getToken().getSecret());
        oauthParams.token(smugmug.getToken().getId());
    }
    resource.addFilter(filter);

    WebResource.Builder builder = resource.getRequestBuilder();
    //User agent
    builder = builder.header("User-Agent", smugmug.getAppName());
    //API Version header
    builder = builder.header("X-Smug-Version", "1.3.0");
    //Response Type header
    builder = builder.header("X-Smug-ResponseType", "JSON");
    //Content-Length header
    builder = builder.header("Content-Length", Long.toString(image.length()));
    //Content-MD5 header
    builder = builder.header("Content-MD5", DigestUtils.md5Hex(imageBytes));
    //X-Smug-FileName header
    builder = builder.header("X-Smug-FileName", image.getName());
    //X-Smug-AlbumID header
    builder = builder.header("X-Smug-AlbumID", Integer.toString(albumId));
    //X-Smug-Caption header
    if(caption != null){
        builder = builder.header("X-Smug-Caption", caption);
    }
    //X-Smug-Caption header
    if(keywords != null){
        builder = builder.header("X-Smug-Keywords", keywords);
    }
    //X-Smug-Hidden header
    if(hidden != null){
        builder = builder.header("X-Smug-Hidden", hidden.toString());
    }
    //X-Smug-ImageID header
    if(imageId != null){
        builder = builder.header("X-Smug-ImageID", imageId.toString());
    }
    //X-Smug-Altitude header
    if(altitude != null){
        builder = builder.header("X-Smug-Altitude", altitude.toString());
    }
    //X-Smug-Latitude header
    if(latitude != null){
        builder = builder.header("X-Smug-Latitude", latitude.toString());
    }
    //X-Smug-Latitude header
    if(longitude != null){
        builder = builder.header("X-Smug-Longitude", longitude.toString());
    }
    //X-Smug-Pretty header
    if(pretty){
        builder = builder.header("X-Smug-Pretty", Boolean.toString(pretty));
    }

    SMResponse response = builder.post(SMResponse.class, new String(imageBytes));
    if (!"ok".equals(response.getStat())) {
        throw new SmugMugException(response);
    }
    return true;
}

我哪里出错了?


只是想看看响应:
SMResponse response = builder.entity(image).post(SMResponse.class);

它实际上发回了一个空白响应(没有 json),这本身就很奇怪,因为我本以为会返回一些消息。这是输出:

Nov 21, 2012 11:55:48 PM com.sun.jersey.api.client.filter.LoggingFilter log
INFO: 1 * Client in-bound response
1 < 200
1 < Edge-Control: no-store
1 < X-SmugMug-Hiring: How to love what you do: http://www.smugmug.com/jobs/
1 < Date: Thu, 22 Nov 2012 05:55:48 GMT
1 < Content-Length: 0
1 < X-SmugMug-Values: 4/4 - It's the product, stupid
1 < Expires: Thu, 22 Nov 2012 05:55:49 GMT
1 < Connection: keep-alive
1 < Content-Type: application/json; charset=utf-8
1 < X-Powered-By: SmugMug/0.9
1 < Server: Apache
1 < Cache-Control: private, no-store, no-cache, max-age=1, must-revalidate
1 < 

【问题讨论】:

  • 你可以试试 SMResponse response = builder.entity(image).post(SMResponse.class);
  • @Reddy 问题在于在这种情况下我应该在哪里设置图像本身的数据。
  • 它本质上是一个HTTP请求,所以尝试使用Fiddler/BurpSuite等调试工具捕获流量,我发现这种方法在尝试定位问题时特别有用。
  • 除了已经设置好的headers,还需要为图片设置哪些数据?
  • @Reddy 在我上传到 SmugMug 的图像文档中,他们称之为“二进制数据”。我假设它是文件本身的字节[]。

标签: java post jersey http-post


【解决方案1】:

我不确定发生了什么,但是在 SmugMug 帐户设置中找到上传日志后,我能够让它工作(要到达那里,请转到工具 -> 帐户设置 -> 统计信息 -> 上传 -> 详细信息) .请注意,在上传日志中,有一个开关可以仅显示错误或所有上传。

现在来看看如何设置发布请求的实际“正文”的实际答案。实际格式应该是我发布的第一个:

SMResponse response = builder.post(SMResponse.class, Files.readAllBytes(image.toPath()));

所以要么我搞砸了,并认为它无法正常工作,当时 smugmug 的结束存在问题,或者我的代码中有其他错误,在我的过程中得到了修复试图解决这个非问题。

【讨论】:

    猜你喜欢
    • 2011-07-15
    • 2013-11-29
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2018-12-13
    • 1970-01-01
    相关资源
    最近更新 更多