Подтвердить что ты не робот

Как отправлять файлы с помощью JSoup?

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

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

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

4b9b3361

Ответ 1

Это поддерживается только с 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", "[email protected]")
    .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("[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);
// ...

Ответ 2

Принятый ответ работает и был правильным на момент написания, но с тех пор 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","[email protected]")            
    .data("file1", "filename", fs1)
    .method(Method.POST)
    .execute();

Ответ 3

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

        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), а затем использую его для последующей загрузки файла.

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