我正在尝试从网页下载文件,同时继续浏览同一网页。
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);
}
}
进入我想要的网站后,我导航到下载链接,单击,程序开始下载。到目前为止一切顺利,问题是下载文件很重,在下载时我想继续浏览该页面。当我点击一个链接时,浏览器什么也不做,只有当下载完成时才会转到我点击的链接。我不太清楚发生了什么,因为我将下载放在一个单独的线程中,但似乎浏览器不在乎,在我完成下载之前不会让我继续浏览网站。
如何通过网页免费下载导航?
谢谢!