I am trying to download a file from a web page and at the same time continue browsing the same web page.
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);
}
}
Once I am on the website that I want, I navigate to the download link, I click and the program starts the download. So far so good, the issue is that the download file weighs a lot and while I'm downloading I want to continue browsing the page. When I click on a link the browser does nothing and just when the download finishes go to the link that I clicked. I do not know very well what is happening because the download I put in a separate thread but it seems that the browser does not care and will not let me continue browsing the website until I finish the download.
How can I free the download of the navigation through the web page?
Thank you!