2011-12-24 7 views
3

ファイルアップロードボタン(http以上)を使用してjsf Webページのみを公開するサーバーにファイルをアップロードする必要があります。私はファイルを生成し、server.Sadlyファイルをアップロードする必要があるサーバーにFTPまたはSFTPを提供していないファイルをアップロードするプロセスを(Javaスタンドアロンプ​​ロセスとして)自動化する必要があります。これを行う方法はありますか?ファイルをウェブサイトにプログラムでアップロードするにはどうすればよいですか?

私は底部に向かって、「HttpClientをベースのFileUploadを使用する」というタイトルのセクションがあります、あなたが欲しいものを説明だと思うおかげで、 リッチー

+0

あなたはそれのためのワーキングサンプルコードを保つことができます。 – spt

答えて

7

プログラムでJSF-生成されたフォームを送信すると、あなたはアカウントに次の3つの事取ることを確認する必要があります。ウェブサイトは、JSFサーバー側状態保存がオンになっている確か場合

  1. は、(HTTPセッションを維持します)。
  2. javax.faces.ViewState非表示フィールドの名前と値のペアを送信します。
  3. 仮想的に押されるボタンの名前と値のペアを送信します。

これ以外の場合、アクションはまったく呼び出されない可能性があります。残りの人にとっては、それは「通常の」形式と変わらない。フローは基本的に次のとおりです。

  • フォームのページでGETリクエストを送信します。
  • JSESSIONID Cookieを抽出します。
  • javax.faces.ViewState隠しフィールドの値を応答から抽出します。必要に応じて(動的に生成された名前があり、すべての要求が変更される可能性があることを確認するには)、入力ファイルのフィールド名と送信ボタンを適切に抽出します。動的に生成されたID /名前は、接頭辞j_idで認識できます。
  • multipart/form-data POSTリクエストを準備します。
  • JSESSIONIDクッキー(該当しない場合はnull)をその要求に設定します。
  • javax.faces.ViewState隠しフィールドとボタンの名前と値のペアを設定します。
  • アップロードするファイルを設定します。

任意のHTTPクライアントライブラリを使用してタスクを実行できます。標準のJava SE APIにはpretty low levelというjava.net.URLConnectionがあります。より冗長なコードで終了するには、Apache HttpClientを使用してHTTP要求を行い、Cookieを管理し、Jsoupを使用してHTMLからデータを抽出することができます。ここで

は、キックオフの例ですが、(そうでなければ、JsoupのCSSセレクタにそのフォームの固有の識別子を含める必要がある)ページには、一つだけ<form>を持っていると仮定:

String url = "http://localhost:8088/playground/test.xhtml"; 
String viewStateName = "javax.faces.ViewState"; 
String submitButtonValue = "Upload"; // Value of upload submit button. 

HttpClient httpClient = new DefaultHttpClient(); 
HttpContext httpContext = new BasicHttpContext(); 
httpContext.setAttribute(ClientContext.COOKIE_STORE, new BasicCookieStore()); 

HttpGet httpGet = new HttpGet(url); 
HttpResponse getResponse = httpClient.execute(httpGet, httpContext); 
Document document = Jsoup.parse(EntityUtils.toString(getResponse.getEntity())); 
String viewStateValue = document.select("input[type=hidden][name=" + viewStateName + "]").val(); 
String uploadFieldName = document.select("input[type=file]").attr("name"); 
String submitButtonName = document.select("input[type=submit][value=" + submitButtonValue + "]").attr("name"); 

File file = new File("/path/to/file/you/want/to/upload.ext"); 
InputStream fileContent = new FileInputStream(file); 
String fileContentType = "application/octet-stream"; // Or whatever specific. 
String fileName = file.getName(); 

HttpPost httpPost = new HttpPost(url); 
MultipartEntity entity = new MultipartEntity(); 
entity.addPart(uploadFieldName, new InputStreamBody(fileContent, fileContentType, fileName)); 
entity.addPart(viewStateName, new StringBody(viewStateValue)); 
entity.addPart(submitButtonName, new StringBody(submitButtonValue)); 
httpPost.setEntity(entity); 
HttpResponse postResponse = httpClient.execute(httpPost, httpContext); 
// ... 
+0

私は無駄にこれを試みた。私は同様のダミーのウェブサイトを設定しました。私はjsfページの投稿応答を投稿している間に200 OK応答を得ています。何らかの理由で、submitメソッドが呼び出されていません。私はサーバーにsubmitメソッドのブレークポイントを設定しますが、呼び出しは決してそこに届きません。 – Richie

+0

これまでの情報で本当の問題を指摘するのは難しいです。特定のWebサイトで動作させるために、コード例で変更する必要があることを理解していますか? – BalusC

+0

yup。 URLを変更してボタンの値をWebページに合わせて送信しました。アップロードするファイルのパスも変更しました – Richie

1

のHttpClientを使用してみてください、here's an article

これが役に立ちます。

+0

答えはありがとう。私はこれを試していたが、それはjsfアプリだったので、私は隠されたパラメータを設定しなければならず、BalusCは彼の答えで指摘した。 – Richie

0

おそらく、そのWebページは、フォームの内容を含むPOST要求をサーバーに送信するだけです。そのページを使わずに、Javaから自分でPOSTリクエストを簡単に送ることができます。例えばthis articleは、JavaからのPOSTリクエストの送信例を示しています。

0

あなたがする必要があるのは、ページ上のHTMLを調べ、フォームを投稿するために必要なパラメータを調べることです。これはおそらく、このようなものを見てみましょう:

String data = URLEncoder.encode("value1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8"); 
data += "&" + URLEncoder.encode("file1", "UTF-8") + "=" + URLEncoder.encode(FileData, "UTF-8"); 

// Send data 
URL url = new URL("http://servername.com/RequestURL"); 
URLConnection conn = url.openConnection(); 
conn.setDoOutput(true); 
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
wr.write(data); 
wr.flush(); 
wr.close(); 

がページを書いた人が行う可能性があることを忘れないでください:あなたはURLにPOSTリクエストを行うにはいくつかのコードを書くことができるということに基づいて

<form action="/RequestURL"> 
<input type=file name=file1> 
<input type=textbox name=value1> 
</form> 

POSTリクエストが同じサイトから来たものであることを確認するためにいくつかのチェックが行われます。その場合、問題が発生している可能性があり、ユーザエージェントを正しく設定する必要があるかもしれません。

0

これにはHtmlUnitを使用できます。ブラウザの動作をシミュレートするための非常に簡単なAPIを提供します。私はすでに、このアプローチを同様の要件に使用していました。それは超簡単。あなたはそれを試してみるべきです。

関連する問題