2012-05-03 70 views
0

我有試圖讓一個HTTP調用我的servlet下面的代碼片段:如何訪問servlet並下載附件?

try { 
     // Construct data 
     String data = URLEncoder.encode("rpt_type", "UTF-8") + "=" + URLEncoder.encode(reportType, "UTF-8"); 
     data += "&" + URLEncoder.encode("rpt_project", "UTF-8") + "=" + URLEncoder.encode(reportProject, "UTF-8"); 
     data += "&" + URLEncoder.encode("rpt_mrv_creator", "UTF-8") + "=" + URLEncoder.encode(reportMrvCreator, "UTF-8"); 
     data += "&" + URLEncoder.encode("rpt_gi_recipient", "UTF-8") + "=" + URLEncoder.encode(reportGiRecipient, "UTF-8"); 
     data += "&" + URLEncoder.encode("rpt_plant", "UTF-8") + "=" + URLEncoder.encode(reportPlant, "UTF-8"); 
     data += "&" + URLEncoder.encode("rpt_sloc", "UTF-8") + "=" + URLEncoder.encode(reportStorageLoc, "UTF-8"); 
     data += "&" + URLEncoder.encode("rpt_gi_no", "UTF-8") + "=" + URLEncoder.encode(reportGiNo, "UTF-8"); 
     data += "&" + URLEncoder.encode("date_sap_gi_fr", "UTF-8") + "=" + URLEncoder.encode(reportDateGiFrom, "UTF-8"); 
     data += "&" + URLEncoder.encode("date_sap_gi_to", "UTF-8") + "=" + URLEncoder.encode(reportDateGiTo, "UTF-8"); 
     data += "&" + URLEncoder.encode("rpt_partno", "UTF-8") + "=" + URLEncoder.encode(reportPartNo, "UTF-8"); 
     data += "&" + URLEncoder.encode("rpt_so_no", "UTF-8") + "=" + URLEncoder.encode(reportSvcOrderNo, "UTF-8"); 
     data += "&" + URLEncoder.encode("date_scan_fr", "UTF-8") + "=" + URLEncoder.encode(reportDateScanFrom, "UTF-8"); 
     data += "&" + URLEncoder.encode("date_scan_to", "UTF-8") + "=" + URLEncoder.encode(reportDateScanTo, "UTF-8"); 
     System.out.println("[data]\n" + data); 

     // Send data 
     String urlString = "http://localhost:8080/aerobook/GIStatusReportDownload?" + data; 
     System.out.println("[url] " + urlString); 
     URL url = new URL(urlString); 
     URLConnection conn = url.openConnection(); 
     //conn.setDoOutput(true); 
     //OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
     //wr.write(data); 
     //wr.flush(); 

     // Get the response 
     BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     String line; 
     while ((line = rd.readLine()) != null) { 
      System.out.println(line); 
     } 
     //wr.close(); 
     rd.close(); 
    } catch (Exception e) { 
    } 

我調試輸出:

[data] 
rpt_type=d&rpt_project=aaa&rpt_mrv_creator=bbb&rpt_gi_recipient=ccc&rpt_plant=ddd&rpt_sloc=eee&rpt_gi_no=fff&date_sap_gi_fr=02%2F05%2F2012&date_sap_gi_to=03%2F05%2F2012&rpt_partno=ggg&rpt_so_no=hhh&date_scan_fr=26%2F05%2F2012&date_scan_to=31%2F05%2F2012 
[url] http://localhost:8080/aerobook/GIStatusReportDownload?rpt_type=d&rpt_project=aaa&rpt_mrv_creator=bbb&rpt_gi_recipient=ccc&rpt_plant=ddd&rpt_sloc=eee&rpt_gi_no=fff&date_sap_gi_fr=02%2F05%2F2012&date_sap_gi_to=03%2F05%2F2012&rpt_partno=ggg&rpt_so_no=hhh&date_scan_fr=26%2F05%2F2012&date_scan_to=31%2F05%2F2012 

在我的servlet(從上面的代碼單獨的文件)我生成下載Excel文件:

res.setContentType(sContentType); 
    res.setHeader("Content-Disposition", "attachment;filename=\"" + sExcelFileName + "\""); 
    OutputStream oOutStrm = res.getOutputStream(); 
    wbBook.write(oOutStrm); 
    oOutStrm.close(); 

我在這裏的問題是,從我的代碼生成(如上面的調試輸出)的URL,我可以訪問我的servlet一nd我設法得到另存爲對話框。

我想獲取在我的代碼中使用生成的文件的內容。有沒有什麼辦法可以從我的代碼中獲取附件,以字節流或任何其他格式?


編輯#3:盪滌頂部

+0

你在瀏覽器中檢查了你的網址嗎? –

+0

是的,我做過。在我上面的代碼段中,'System.out.println(data);'產生了字符串'key1 = value1&key2 = value2'。我所做的是,我附加「?」到我的網址,然後是這個字符串。我得到的結果是'http:// localhost/MyProject/MyServlet?key1 = value1&key2 = value2'。我進入瀏覽器地址欄,我可以下載我的excel文件。我想在我的代碼中獲取excel文件的內容,但到目前爲止它不工作。 – ohseekay

+0

好的。檢查此示例http://www.roseindia.net/java/example/java/io/file-url-download.shtml –

回答

0

I want to get the contents of the excel file on my code, but so far it's not working.

我發現代碼中沒有錯誤。
我相信你想要將輸入流中的內容轉換爲HSSFWorkbook對象。
以下代碼片段將幫助你。

java.net.URLConnection conn = url.openConnection(); 
java.io.InputStream is = conn.getInputStream(); 
org.apache.poi.hssf.usermodel.HSSFWorkbook workBook = new org.apache.poi.hssf.usermodel.HSSFWorkbook(is); 
System.out.println("Number of Sheets: " + workBook.getNumberOfSheets()); 
org.apache.poi.hssf.usermodel.HSSFSheet sheet = workBook.getSheetAt(0); 
System.out.println("Sheet Name: " + sheet.getSheetName()); 

// rest of your code to handle the captured workBook 
// cheers 
0

檢查wbBook.write(oOutStrm);東西是否已經寫入的OutputStream,還需要密切之前調用它oOutStrm.flash()

+0

我很確定有數據寫入它。 正如我在我的問題中提到的,當我通過URL訪問我的servlet時,我得到一個另存爲對話框,我可以保存該文件。但是,我無法在我的代碼上覆制此代碼。 – ohseekay

+0

你發送這個'URL url = new URL(「http:// localhost/MyProject/MyServlet」);'你的代碼沒有任何參數,與你在瀏覽器中輸入的內容不同。 – user1335794

+0

'conn.setDoOutput(true);'後面的三行應該發送數據到我的servlet,不是嗎?或者我在這裏錯過了什麼? – ohseekay

1

當您在瀏覽器中輸入URI時,您正在執行GET請求。然而,您的客戶端Java代碼會生成POST請求,並在正文中發送參數,而不是URI。

您可能想查看HTTP跟蹤並進行比較。

+0

這聽起來很合理!我不知道如何做一個HTTP跟蹤,但我該如何去做我的Java代碼中的GET請求? – ohseekay

+0

Re:編輯#2,我想我的代碼現在正在執行GET請求,但沒有執行任何操作 – ohseekay

0

我懷疑問題在於OutputStream oOutStrm = res.getOutputStream();

我敢打賭resHttpServletResponse它返回一個ServletOutputStream適合在響應中寫入二進制數據。 servlet容器不編碼的二進制數據

檢查API

所以,你可能不會得到除了文件名什麼。

在Servlet的嘗試

FileOutputStream stream = new FileOutputStream("c:/excel/Book1.xls"); 
workBook.write(stream); 
+0

不幸的是,由於某些原因,我無法對servlet進行更改:( – ohseekay

+0

檢查編輯的答案。寫一些東西到'OutputStream',否則你將不會得到任何輸出。 –

+0

我不明白你的意思。現在'wbBook.write(oOutStrm);'工作,內容類型被設置爲'application/ms-excel '。servlet代碼被許多子類繼承,所以我很難在這裏修改代碼。 – ohseekay