2011-12-13 40 views
1

正如標題所述如何在scribe oauthrequest中添加文件參數?

似乎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的圖像(不知道是否有更簡單的方法)

回答

4

當然addBodyParameter不會工作,因爲你不想包含一個身體參數,你想創建一個多部分http請求。

抄寫並不會讓你輕鬆上手,原因是Apis支持文件上傳並不常見,其他庫很好地完成了這項工作。 (當抄寫員被遷移到使用apache commons http時,事情將更容易爲大家)

作爲@Chris說雖然(+1),您可以並且被鼓勵使用addPayload方法,但您需要創建多部分請求你自己。抱歉。

聲明:我是圖書館的作者。

+0

如果我只是使用addPayload手動創建多部分請求,還是需要更改org.scribe.model.Request中的某些內容,它會起作用嗎?(因爲它將Content-Type頭部設置爲已存在。 ) – rgngl

3

我以爲你是這裏的問題是你如何閱讀圖像文件。將圖像表示爲從一次讀入的字符構建的字符串導致問題。雖然char是一個字節,但Java中的Strings是UTF-8。當你輸出一個字符串時,你不只是得到你用來構建它的字符,你會得到UTF-8的表示。

所以沒有嘗試過這個我自己,你試過使用public void addPayload(byte[] payload)方法而不是addBodyParameter(key, value)?這似乎是馬上做到這一點。

+0

但我還需要一個鍵(這是「照片」,將圖像上傳到Flickr)。所以最初我嘗試oauthRequest.addBodyParameter(「photo」,imageFileAsString); ,當然沒有用 – fajrian

1

要添加到什麼@Pablo說,如果你已經使用Apache 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[],所以如果你發送巨型文件,這可能不是最佳的。但是,對於小型上傳,這對我來說是個訣竅。

相關問題