Как добавить параметр файла внутри писца oauthrequest? - PullRequest
1 голос
/ 13 декабря 2011

Как указано в заголовке

Кажется, что oauthRequest.addBodyParameter (ключ, значение) не работает так хорошо, если входной файл является

Я попытался сделать следующее, чтобызаставить файл в строку, но безрезультатно:

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 программно (не уверен, есть ли более простой способ)

Ответы [ 3 ]

4 голосов
/ 13 декабря 2011

Конечно, addBodyParameter не будет работать, потому что вы не хотите включать параметр body, вы хотите создать многокомпонентный http-запрос.

Scribe не делает это легким для вас, и причина в том, что Apis не очень часто поддерживает загрузку файлов, и другие библиотеки делают это хорошо. (Когда переписчик переходит на использование Apache Commons http, все будет проще для всех)

Хотя @Chris говорит, что (+1) вы можете и рекомендуется использовать метод addPayload, но вам нужно будет самостоятельно создать составной запрос. К сожалению.

Отказ от ответственности: я автор библиотеки.

3 голосов
/ 13 декабря 2011

Я думаю, что у вас возникла проблема с тем, как вы читаете файл изображения. Представление изображения в виде строки, построенной из символов, которые вы читаете по одному, вызывает проблему. Пока символ является байтом, строки в Java находятся в UTF-8. Когда вы выводите строку, вы не просто получаете символы, которые использовали для ее построения, вы получаете представление UTF-8.

То есть, не попробовав это сам, пробовали ли вы использовать метод public void addPayload(byte[] payload) вместо addBodyParameter(key, value)? Похоже, сейчас это нужно сделать.

2 голосов
/ 28 января 2013

Чтобы добавить к сказанному @Pablo, если вы уже используете клиентские библиотеки HTTP Apache Commons, вы можете использовать объект 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[] памяти, поэтому, если вы отправляете гигантские файлы, это может быть неоптимальным. Однако для небольших загрузок это помогло мне.

...