2012-05-03 28 views
0

I持って私のサーブレットへのHTTP呼び出しを行うためにしようとする次のコードスニペット:サーブレットにアクセスして添付ファイルをダウンロードする方法は?

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 

(上記のコードとは別のファイルに)私は、ダウンロード用のExcelファイルを生成します。

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

ここでの私の問題は、(上記のデバッグ出力に示すように)私のコードによって生成されたURLから、私は私のサーブレットAにアクセスすることができるということです私は[名前を付けて保存]ダイアログを表示することができます。

私のコード内で使用するために生成されたファイルの内容を取得したいと思います。バイトストリームやその他の形式で、自分のコードから添付ファイルを取得する方法はありますか?


編集#3:何かのOutputStreamに書き込まれているかどうかをトップ

+0

ブラウザでURLを確認しましたか? –

+0

はい私はしました。上記の私のコードセグメントでは、 'System.out.println(data);'は文字列 'key1 = value1&key2 = value2'を生成しました。私がしたことは、私は「?」と付け加えた。私のURLに、この文字列を続けてください。私が得た結果は '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);をクリーンアップ、また、あなたが近いそれの前にoOutStrm.flash()を呼び出す必要があります。

+0

私はそれに書き込まれたデータがあると確信しています。 私の質問で言及したように、URLを介してサーブレットにアクセスすると、名前を付けて保存ダイアログが表示され、ファイルを保存できます。しかし、私は自分のコードでこれを複製することはできません。 – ohseekay

+0

この 'URL url =新しいURL(" http:// localhost/MyProject/MyServlet ");をパラメータなしでブラウザから入力したコードと同じコードで送信します。 – user1335794

+0

'conn.setDoOutput(true);の後の3行は、サーブレットにデータを送信するはずですね。または私はここに何かを逃していますか? – 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を返します。サーブレットコンテナがAPI

だから、バイナリデータ

チェックをコードしない場合は、ファイル名以外のものを取得していない可能性があります。

サーブレットでは、私は、コード内のエラーを見つけること

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

残念ながら、私はいくつかの理由でサーブレットを変更できません:( – ohseekay

+0

編集済みの回答を確認してください。 –

+0

'wbBook.write(oOutStrm);'が動作し、コンテンツタイプが 'application/ms-excel 'に設定されています。 '。サーブレットコードは多くの子クラスに継承されているので、コードの変更を正当化することは非常に難しいです。 – ohseekay

関連する問題