1

如标题所述

如果输入是文件,oauthRequest.addBodyParameter(key, value) 似乎效果不佳

我尝试执行以下操作以强制将文件转换为字符串,但无济于事:

File f = new File("xyz.png");
InputStream is = new FileInputStream(f);
int intValue = -1;
String value = "";
do {
   intValue = is.read();
   if (intValue != -1) {
      char c = (char) intValue;
      value += c;
   }
} while (intValue != -1);

顺便说一句,我正在尝试以编程方式将图像上传到 Flickr(不确定是否有更直接的方法)

4

3 回答 3

4

当然addBodyParameter不会工作,因为您不想包含正文参数,您想创建一个多部分 http 请求。

Scribe 不会让你轻松做到这一点,原因是 Apis 支持文件上传并不是很常见,而其他库很好地做到了这一点。(当 scribe 迁移到使用 apache commons http 时,每个人的事情都会变得更容易)

正如@Chris 所说,尽管 (+1) 您可以并鼓励您使用该addPayload方法,但您需要自己创建多部分请求。对不起。

免责声明:我是图书馆作者。

于 2011-12-13T18:50:14.140 回答
3

我认为您在这里遇到的问题是您如何读取图像文件。将图像表示为由您一次读取一个字符构建的字符串会导致问题。虽然 char 是一个字节,但 Java 中的字符串是 UTF-8。当您输出一个字符串时,您不仅会获得用于构建它的字符,还会获得 UTF-8 表示。

因此,我自己没有尝试过,您是否尝试过使用该public void addPayload(byte[] payload)方法而不是addBodyParameter(key, value)?这似乎是马上去做。

于 2011-12-13T12:04:20.903 回答
2

要补充@Pablo 所说的内容,如果您已经在使用 Apache Commons HTTP 客户端库,则可以使用您的MultipartEntity对象来处理多部分请求格式:

MultipartEntity reqEntity = new MultipartEntity();
// add your ContentBody fields as normal...

// Now, pull out the contents of everything you've added and set it as the payload
ByteArrayOutputStream bos = new ByteArrayOutputStream((int)reqEntity.getContentLength());
reqEntity.writeTo(bos);
oAuthReq.addPayload(bos.toByteArray());

// Finally, set the Content-type header (with the boundary marker):
Header contentType = reqEntity.getContentType();
oAuthReq.addHeader(contentType.getName(), contentType.getValue());

// Sign and send like normal:
service.signRequest(new Token(oAuthToken, oAuthSecret), oAuthReq);
Response oauthResp = oAuthReq.send();

当然,这样做的缺点是您需要将整个内容主体读入byte[]内存中,因此如果您要发送巨大的文件,这可能不是最佳选择。但是,对于小型上传,这对我有用。

于 2013-01-28T06:20:07.513 回答