Javafx webengine我无法同时下载和加载页面

时间:2017-04-23 00:28:01

标签: javafx webview download httpurlconnection webengine

我正在尝试从网页下载文件,同时继续浏览同一网页。

    public class Main extends Application
     {

    String urlBrowser = "";

    @Override
    public void start(final Stage stage) {
        stage.setWidth(800);
        stage.setHeight(500);
        Scene scene = new Scene(new Group());

        final WebView browser = new WebView();
        final WebEngine webEngine = browser.getEngine();

        ScrollPane scrollPane = new ScrollPane();
        scrollPane.setContent(browser);

        ebEngine.locationProperty().addListener(new ChangeListener<String>() {
        @Override 
        public void changed(ObservableValue<? extends String> observableValue, String oldLoc, String newLoc) {
            url = observableValue.getValue());
        }
        });

        webEngine.getLoadWorker().stateProperty()
            .addListener(new ChangeListener<State>() {

            @Override
            public void changed(ObservableValue ov, State oldState, State newState) {
                if (newState == Worker.State.CANCELLED) {
                    if(urlBrowser.contains("download"){
                        try{
                            Download download = new Download(webEngine.getLocation());
                            Thread t = new Thread(download);
                            t.start();
                        }catch(Exception ex){
                            ex.printStackTrace();
                        }
                    }
                }
            });
            webEngine.load("http://www.website.com");
            scene.setRoot(scrollPane);

            stage.setScene(scene);
            stage.show();
        }

        public static void main(String[] args) {
            launch(args);
        }
    }
}


    public class Download implements Runnable{

    private final String urlPath;
    private HttpURLConnection connection;

    public Download(String url) {
        this.urlPath = url;
    }

    @Override
    public void run() {
        try {
            URL url = new URL(urlPath);
            connection = (HttpURLConnection) url.openConnection();
            configConnection();
            download();
        }catch (MalformedURLException ex) {
            ex.printStackTrace();
        }catch (IOException ex) {
            ex.printStackTrace();
        }finally{
            if (connection != null) {
                connection.disconnect();
            }
        }
    }

    private void configConnection(){
        try {
            connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0");
            connection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
            connection.setReadTimeout(0);
            connection.setDoOutput(true);
            try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) {
                wr.writeBytes(parametrosFormulario);
                wr.flush();
            }
        }catch (ProtocolException ex) {
            Logger.getLogger(DownloadFormPost.class.getName()).log(Level.SEVERE, null, ex);
        }catch (IOException ex) {
             Logger.getLogger(DownloadFormPost.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void download(){
        String contentDisposition = connection.getHeaderField("Content-Disposition");
        String url = connection.getURL().getHost();
        String saveFilePath = getFileName("src/test", contentDisposition, url);

        FileOutputStream outputStream = null;
        InputStream inputStream = null;
        try{
            outputStream = new FileOutputStream(saveFilePath);
            inputStream = connection.getInputStream();
            int BUFFER_SIZE = 10240;
            int bytesRead = -1;
            byte[] buffer = new byte[BUFFER_SIZE];
            while ((bytesRead = inputStream.read(buffer)) != -1){
                outputStream.write(buffer, 0, bytesRead);
            }
        }catch(FileNotFoundException ex){
            ex.printStackTrace();
        }catch (IOException ex) {
            ex.printStackTrace();
        }finally{
            try { if (inputStream != null) inputStream.close(); } catch (IOException e) {}
            try { if (outputStream != null) outputStream.close(); } catch (IOException e) {}
        }
    }

    private String getFileName(String path, String contentDisposition, String url){
        String fileName = "";
        if (contentDisposition != null) {
            int index = contentDisposition.indexOf("filename=");
            if (index > 0) {
                fileName = contentDisposition.substring(index + 9, contentDisposition.length()).replace("\"", "");
            }
        } else {
            fileName = url.substring(url.lastIndexOf("/") + 1,
            url.length());
        }
        return (path + File.separator + fileName);
    }
}

一旦我在我想要的网站上,我导航到下载链接,我点击该程序开始下载。到目前为止一直很好,问题是下载文件很重,而我下载时我想继续浏览页面。当我点击链接时,浏览器什么都不做,只是在下载完成后转到我点击的链接。 我不太清楚发生了什么,因为下载我放在一个单独的线程中,但似乎浏览器并不关心,在我完成下载之前不会让我继续浏览网站。

  

如何通过网页免费下载导航?

谢谢!

1 个答案:

答案 0 :(得分:1)

好吧,我尝试了Apache HttpClient库,并且明确地做了与HttpURLConnection相同的事情。 但是使用JSoup我能够达到我想要的效果。在下载过程中,我可以毫无问题地浏览网站。我留下了我用来从表单下载文件的代码,以防有人为你服务。谢谢jewelsea!

Response response = Jsoup.connect(url)
                    .method(Connection.Method.POST)
                    .ignoreContentType(true)
                    .timeout(0)
                    .data("user","user")
                    .data("pass","pass")
                    .execute();

String saveFilePath = "file.zip";
FileOutputStream outputStream = null;
InputStream inputStream = null;
try{
    outputStream = new FileOutputStream(saveFilePath);
    inputStream = new ByteArrayInputStream(ByteBuffer.wrap(response.bodyAsBytes()).array());
    int BUFFER_SIZE = 1024;
    int bytesRead = -1;
    byte[] buffer = new byte[BUFFER_SIZE];
    while ((bytesRead = inputStream.read(buffer)) != -1)
        outputStream.write(buffer, 0, bytesRead);
}catch(FileNotFoundException ex){
    ex.printStackTrace();
}catch (IOException ex) {
    ex.printStackTrace();
} catch (Exception ex) {
    ex.printStackTrace();
}finally{
    try { if (inputStream != null) inputStream.close(); } catch (IOException e) {}
    try { if (outputStream != null) outputStream.close(); } catch (IOException e) {}
}