2012-01-09 53 views
4

我正在開發使用Dropbox API的Jersey服務。如何將通用文件發送至球衣服務並正確接收?

我需要發佈一個通用文件到我的服務(該服務將能夠管理每種文件以及您可以使用Dropbox API)。

客戶端

所以,我已經實現了一個簡單的客戶端:

  • 打開文件,
  • 創建到URL的連接,
  • 設置正確的HTTP方法,
  • 創建一個FileInputStream並使用字節緩衝區將文件寫入連接的輸出流。

這是客戶端測試代碼。

public class Client { 

    public static void main(String args[]) throws IOException, InterruptedException { 
    String target = "http://localhost:8080/DCService/REST/professor/upload"; 
    URL putUrl = new URL(target); 
    HttpURLConnection connection = (HttpURLConnection) putUrl.openConnection(); 

    connection.setDoOutput(true); 
    connection.setInstanceFollowRedirects(false); 
    connection.setRequestMethod("POST"); 
    connection.setRequestProperty("content-Type", "application/pdf"); 

    OutputStream os = connection.getOutputStream(); 

    InputStream is = new FileInputStream("welcome.pdf"); 
    byte buf[] = new byte[1024]; 
    int len; 
    int lung = 0; 
    while ((len = is.read(buf)) > 0) { 
     System.out.print(len); 
     lung += len; 
     is.read(buf); 
     os.write(buf, 0, len); 
    } 
    } 
} 

服務器端

我有一個方法:

  • 獲得一個InputStream作爲參數,
  • 創建一個與原始的相同名稱和類型的文件文件。

以下代碼實現了一個用於接收特定PDF文件的測試方法。

@PUT 
@Path("/upload") 
@Consumes("application/pdf") 
public Response uploadMaterial(InputStream is) throws IOException { 
    String name = "info"; 
    String type = "exerc"; 
    String description = "not defined"; 
    Integer c = 10; 
    Integer p = 131; 
    File f = null; 
    try { 
    f = new File("welcome.pdf"); 

    OutputStream out = new FileOutputStream(f); 
    byte buf[] = new byte[1024]; 
    int len; 
    while ((len = is.read(buf)) > 0) 
     out.write(buf, 0, len); 
    out.close(); 
    is.close(); 
    System.out.println("\nFile is created........"); 
    } catch (IOException e) { 
    throw new WebApplicationException(Response.Status.BAD_REQUEST); 
    } 

    //I need to pass a java.io.file object to this method 
    professorManager.uploadMaterial(name, type, description, c,p, f); 

    return Response.ok("<result>File " + name + " was uploaded</result>").build(); 
} 

此實現僅適用於文本文件。如果我嘗試發送簡單PDF,則收到的文件不可讀(在將它保存到磁盤後)。

我該如何滿足我的要求?任何人都可以提出解決方案

+0

你能發佈你的客戶端和服務器代碼嗎?沒有這一點,很難說出什麼問題。 – 2012-01-09 06:35:07

+0

感謝您的迴應。我添加了一些代碼。 – pierus 2012-01-09 10:15:42

回答

7

你是客戶端代碼有問題。

while ((len = is.read(buf)) > 0) { 
    ... 
    is.read(buf); 
    ... 
} 

你從InputStream兩次在每次迭代閱讀。從循環體刪除read聲明,你會沒事的。

你也說過你的問題中提出的代碼適用於文本文件。我認爲這也行不通。從您嘗試上傳的文件中讀取兩次意味着您只上傳了一半的內容。一半的文本文件仍然是一個文本文件,但是一半PDF只是垃圾,所以你不能打開後者。如果上傳和保存的文本文件的內容與原始文件的內容相同,則應該進行雙重檢查。

+0

你是對的!多麼愚蠢的錯誤。現在它可以工作。 – pierus 2012-01-09 20:47:08

+0

我藉此機會問您另一個問題:我如何使用apache httpclient庫實現相同的客戶端功能? – pierus 2012-01-09 20:54:40

+0

@pierus對不起,但我不熟悉Apache的HttpClient。但是,如果您要使用Jersey,那麼我建議您使用[Jersey's Client API](http://jersey.java.net/nonav/documentation/latest/user-guide.html#d4e616),這是工具與澤西資源(任何其他RESTful界面作爲事實的一個標準)進行交互。 – 2012-01-09 21:07:34

相關問題