2011-09-10 2 views
12

`m utilizzando i seguenti valori CAP utilizzando JSoup:Come pubblicare file usando JSoup?

Document document = Jsoup.connect("http://www......com/....php") 
        .data("user","user","password","12345","email","[email protected]") 
        .method(Method.POST) 
        .execute() 
        .parse(); 

E ora voglio inviare un file, anche. Come un modulo con un campo di file. È possibile? Se è così come?

risposta

14

Questo è supportato solo da Jsoup 1.8.2 (13 aprile 2015) tramite il nuovo metodo data(String, String, InputStream).

String url = "http://www......com/....php"; 
File file = new File("/path/to/file.ext"); 

Document document = Jsoup.connect(url) 
    .data("user", "user") 
    .data("password", "12345") 
    .data("email", "[email protected]") 
    .data("file", file.getName(), new FileInputStream(file)) 
    .post(); 
// ... 

Nelle versioni più vecchie, l'invio di multipart/form-data richieste non è supportato. La cosa migliore è utilizzare un client HTTP completo per questo, come ad esempio Apache HttpComponents Client. In definitiva, è possibile ottenere la risposta del client HTTP come String in modo da poterlo alimentare con il metodo Jsoup#parse().

String url = "http://www......com/....php"; 
File file = new File("/path/to/file.ext"); 

MultipartEntity entity = new MultipartEntity(); 
entity.addPart("user", new StringBody("user")); 
entity.addPart("password", new StringBody("12345")); 
entity.addPart("email", new StringBody("[email protected]")); 
entity.addPart("file", new InputStreamBody(new FileInputStream(file), file.getName())); 

HttpPost post = new HttpPost(url); 
post.setEntity(entity); 

HttpClient client = new DefaultHttpClient(); 
HttpResponse response = client.execute(post); 
String html = EntityUtils.toString(response.getEntity()); 

Document document = Jsoup.parse(html, url); 
// ... 
4

Le opere risposta accettata ed è stato corretto al momento della scrittura, ma da allora JSoup si è evoluta e since version 1.8.2 it is possible to send files as part of multipart forms:

File file1 = new File("/path/to/file"); 
FileInputStream fs1 = new FileInputStream(file1); 

Connection.Response response = Jsoup.connect("http://www......com/....php") 
    .data("user","user","password","12345","email","[email protected]")    
    .data("file1", "filename", fs1) 
    .method(Method.POST) 
    .execute(); 
0

Questo post mi ha portato alla strada giusta, ma ho dovuto modificare il risposte pubblicate per far funzionare il mio caso d'uso. Ecco il mio codice:

 FileInputStream fs = new FileInputStream(fileToSend); 
     Connection conn = Jsoup.connect(baseUrl + authUrl) 
       .data("username",username) 
       .data("password",password); 
     Document document = conn.post(); 

     System.out.println("Login successfully! Session Cookie: " + conn.response().cookies()); 


     System.out.println("Attempting to upload file..."); 
     document = Jsoup.connect(baseUrl + uploadUrl) 
       .data("file",fileToSend.getName(),fs) 
       .cookies(conn.response().cookies()) 
       .post(); 

La differenza fondamentale è che ho l'accesso al sito, conservo il cookie dalla risposta (conn) e poi lo uso per il successivo upload di file.

Spero che aiuti ragazzi.