2011-12-24 4 views
3

파일 업로드 버튼 (http 이상)이있는 jsf 웹 페이지 만 노출하는 서버에 파일을 업로드해야합니다. 파일을 생성하고 서버에 파일을 업로드하는 프로세스 (자바 독립 실행 형 프로세스로 완료)를 자동화해야합니다. 파일을 업로드해야하는 서버는 FTP 또는 SFTP를 제공하지 않습니다. 이것을 할 수있는 방법이 있습니까?프로그래밍 방식으로 파일을 웹 사이트에 업로드하려면 어떻게해야합니까?

덕분에, 리치

+0

당신이 그것을위한 작업 예제 코드를 유지 할 수 있습니다 . – spt

답변

7

, 당신은 당신이 계정에 다음과 같은 3 가지를 가지고 있는지 확인해야합니다 :

  1. 는 HTTP 세션을 유지 (확실히 웹 사이트가 JSF 서버 측 상태 저장이 켜져있는 경우).
  2. javax.faces.ViewState 숨김 필드의 이름 - 값 쌍을 보냅니다.
  3. 사실상 눌러야하는 버튼의 이름 - 값 쌍을 보냅니다.

그렇지 않으면 조치가 전혀 호출되지 않을 수 있습니다. 남은자를 위해 그것은 "정규적인"형태와 다르지 않다. 흐름은 기본적으로 다음과 같습니다.

  • 양식이있는 페이지에서 GET 요청을 보냅니다.
  • JSESSIONID 쿠키를 추출하십시오.
  • 응답에서 javax.faces.ViewState 숨김 필드의 값을 추출하십시오. 필요하다면 (동적으로 생성 된 이름이 있고 모든 요청이 변경 될 수 있는지 확인하려면) 입력 파일 필드의 이름과 제출 버튼을 잘 추출하십시오. 동적으로 생성 된 ID/이름은 j_id 접두어로 인식 할 수 있습니다.
  • multipart/form-data POST 요청을 준비하십시오.
  • 는 요청에 JSESSIONID 쿠키 (그렇지 않으면 null)를 설정합니다.
  • javax.faces.ViewState 숨김 필드와 버튼의 이름 - 값 쌍을 설정하십시오.
  • 업로드 할 파일을 설정하십시오.

당신은 작업을 수행 할 수있는 HTTP 클라이언트 라이브러리를 사용할 수 있습니다. 표준 Java SE API는 pretty low leveljava.net.URLConnection을 제공합니다. 보다 자세한 코드로 끝내려면 Apache HttpClient을 사용하여 HTTP 요청을 수행하고 쿠키를 관리하고 Jsoup을 사용하여 HTML에서 데이터를 추출 할 수 있습니다. 여기

페이지가 가지고있는 가정, 킥오프의 예제 하나의 <form> (그렇지 않으면 당신은 Jsoup의 CSS 선택기에서 해당 형식의 고유 식별자를 포함해야합니다) :

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 메소드를 호출하지 않습니다. 서버에 제출 메서드에 대한 중단 점을 넣었지만 호출이 결코 거기에 도달하지 않습니다. – Richie

+0

지금까지 제공된 정보로 실제 문제를 지적하는 것은 어렵습니다. 특정 웹 사이트에서 작동하도록 코드 예제에서 변경해야하는 사항을 이해하고 있습니까? – BalusC

+0

예. URL을 변경하고 버튼 값을 내 웹 페이지와 일치하도록 제출했습니다. 업로드 할 파일 경로도 변경했습니다. – Richie

1

는 "HttpClient를 기반는 FileUpload 사용"HttpClient를, 당신이 바닥을 향해라는 제목의 섹션 거기, 희망 사항을 생각 here's an article를 사용해보십시오.

희망이 도움이됩니다.

+0

답변을 주셔서 감사합니다. 나는 이것을 시도했지만 jsf 앱 이었기 때문에 숨겨진 매개 변수를 설정해야했고 BalusC는 그의 대답에서 지적했다. – Richie

0

아마 그 웹 페이지는 양식의 내용으로 서버에 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를 제공합니다. 비슷한 요구 사항에 이미이 방법을 사용했습니다. 그건 매우 쉬워요. 시도 해봐야합니다. 프로그래밍 JSF 생성 양식을 제출하면

관련 문제