Java 如何在scribe oauthrequest中添加文件参数?

Java 如何在scribe oauthrequest中添加文件参数?,java,file,file-upload,oauth,scribe,Java,File,File Upload,Oauth,Scribe,如标题所述 如果输入是一个文件,那么oauthRequest.addBodyParameterkey的值似乎不能很好地工作 我尝试执行以下操作以将文件强制转换为字符串,但无效: File f = new File("xyz.png"); InputStream is = new FileInputStream(f); int intValue = -1; String value = ""; do { intValue = is.read(); if (intValue != -1)

如标题所述

如果输入是一个文件,那么oauthRequest.addBodyParameterkey的值似乎不能很好地工作

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

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,但不确定是否有更直接的方法

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


因此,我自己没有尝试过,您是否尝试过使用public void addPayloadbyte[]有效负载方法而不是addBodyParameterkey,value?这似乎是马上要做的事。

我认为您现在面临的问题是如何读取图像文件。将图像表示为从一次读入一个字符的字符构建的字符串会导致问题。字符是字节,而Java中的字符串是UTF-8。当您输出一个字符串时,您不仅得到用于构建它的字符,还得到UTF-8表示

因此,我自己没有尝试过,您是否尝试过使用public void addPayloadbyte[]有效负载方法而不是addBodyParameterkey,value?这似乎是马上就可以做到的。

当然,addBodyParameter不起作用,因为您不想包含body参数,而是想创建一个多部分http请求

Scribe并不能让您轻松实现这一点,原因是API支持文件上传并不常见,其他库也能很好地做到这一点。当scribe迁移到使用ApacheCommonsHTTP时,对每个人来说都会更容易

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

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

当然,addBodyParameter不起作用,因为您不想包含body参数,而是想创建一个多部分http请求

Scribe并不能让您轻松实现这一点,原因是API支持文件上传并不常见,其他库也能很好地做到这一点。当scribe迁移到使用ApacheCommonsHTTP时,对每个人来说都会更容易

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

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

要补充@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();

当然,这样做的缺点是需要将整个内容体读入内存中的一个字节[],因此如果要发送巨型文件,这可能不是最佳选择。但是,对于小型上载,这对我来说是个好办法。

要补充@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();

当然,这样做的缺点是需要将整个内容体读入内存中的一个字节[],因此如果要发送巨型文件,这可能不是最佳选择。然而,对于小型上传,这对我来说是个好办法。

但我还需要一个键,它是photo,用于将图像上传到Flickr。因此,最初我尝试oauthRequest.addBodyParameterphoto,imageFileAsString,虽然Courseb没有用,但我还需要一个键,它是photo,用于将图像上传到Flickr。因此,最初我尝试oauthRequest.addBodyParameterphoto,imageFileAsString,如果我只是使用addPayload手动创建了一个多部分请求,或者我需要在org.scribe.model.request中更改一些内容吗?因为它已经在那里设置了内容类型头。如果我只是使用addPayload手动创建了一个多部分请求,或者我需要在org.scribe.model.Request?因为它已经在那里设置了内容类型头。