Как разместить файлы с помощью JSoup? - PullRequest
12 голосов
/ 10 сентября 2011

Я использую следующие значения кода кода, используя JSoup:

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

И теперь я хочу отправить файл тоже.Как форма с полем файла.Это возможно ?Если есть чем, как?

Ответы [ 3 ]

16 голосов
/ 10 сентября 2011

Это поддерживается только с Jsoup 1.8.2 (13 апреля 2015 г.) с помощью нового метода 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", "info@tutorialswindow.com")
    .data("file", file.getName(), new FileInputStream(file))
    .post();
// ...

В более старых версиях отправка multipart/form-data запросовне поддерживается.Для этого лучше всего использовать полноценный HTTP-клиент, такой как Apache HttpComponents Client .В конечном итоге вы можете получить ответ клиента HTTP как String, чтобы можно было передать его методу 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("info@tutorialswindow.com"));
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 голосов
/ 03 января 2016

Принятый ответ работает и был верным на момент написания, но с тех пор JSoup развился и начиная с версии 1.8.2 можно отправлять файлы как часть составных форм :

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","info@tutorialswindow.com")            
    .data("file1", "filename", fs1)
    .method(Method.POST)
    .execute();
0 голосов
/ 13 октября 2017

Этот пост привел меня на правильный путь, но мне пришлось настроить опубликованные ответы, чтобы мой вариант использования работал. Вот мой код:

        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();

Основное отличие состоит в том, что я сначала захожу на сайт, сохраняю cookie из ответа (conn), а затем использую его для последующей загрузки файла.

Надеюсь, это поможет ребята.

...