Java Dateidownload klappt bei einigen Datein nicht

JavaGamer

Bekanntes Mitglied
Hi,

nachdem ich nun meinen Installer, der die Dateien downloadet und dann ins passende Verzeichnis verschiebt fertiggestellt habe, stelle ich nun fest, dass bei einigen Dateien der Download streikt:

Das hier sagt der Log, der erstellt wurde:
Code:
[DEBUG] download URL: https://dl.dropboxusercontent.com/u/57913086/TFC/Build%2079/%5B1.7.10%5DTerraFirmaCraft-0.79.18.673.jar
[DEBUG] directory save file: C:\Users\Patrick\AppData\Roaming\.minecraft\mods
[DEBUG] Content-Type = application/java-archive
[DEBUG] Content-Disposition = inline; filename="[1.7.10]TerraFirmaCraft-0.79.18.673.jar"; filename*=UTF-8''%5B1.7.10%5DTerraFirmaCraft-0.79.18.673.jar
[DEBUG] Content-Length = 18873862
[DEBUG] fileName = [1.7.10]TerraFirmaCraft-0.79.18.673.jar"; filename*=UTF-8''%5B1.7.10%5DTerraFirmaCraft-0.79.18.673.ja
[ERROR] Error downloading file: C:\Users\Patrick\AppData\Roaming\.minecraft\mods\[1.7.10]TerraFirmaCraft-0.79.18.673.jar"; filename*=UTF-8''%5B1.7.10%5DTerraFirmaCraft-0.79.18.673.ja (Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch)
[ERROR] There was a problem!
java.io.FileNotFoundException: C:\Users\Patrick\AppData\Roaming\.minecraft\mods\[1.7.10]TerraFirmaCraft-0.79.18.673.jar"; filename*=UTF-8''%5B1.7.10%5DTerraFirmaCraft-0.79.18.673.ja (Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch)
	at java.io.FileOutputStream.open0(Native Method)
	at java.io.FileOutputStream.open(Unknown Source)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at shadowdragon.installer.task.DownloadTask.doInBackground(DownloadTask.java:52)
	at shadowdragon.installer.task.DownloadTask.doInBackground(DownloadTask.java:1)
	at javax.swing.SwingWorker$1.call(Unknown Source)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at javax.swing.SwingWorker.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Hier dann der Code (die Zeilenangabe vom Crash ist mit einem Kommentar versehen, so das ihr diese auch hier finden könnt 😉 )
Java:
	/**
	 * Executed in background thread
	 */
	@Override
	protected Void doInBackground() throws Exception 
	{
		try
		{
			HTTPDownloadUtil util = new HTTPDownloadUtil();
			util.downloadFile(downloadURL);
			
			// set file information on the GUI
			gui.setFileInfo(util.getFileName(), util.getContentLength());
			
			String saveFilePath = saveDirectory + File.separator + util.getFileName();
			
			InputStream inputStream = util.getInputStream();
			// opens an output stream to save into file
			FileOutputStream outputStream = new FileOutputStream(saveFilePath); // Line 52
			
			byte[] buffer = new byte[BUFFER_SIZE];
			int bytesRead = -1;
			long totalBytesRead = 0;
			int percentCompleted = 0;
			long fileSize = util.getContentLength();
			
			while((bytesRead = inputStream.read(buffer)) != -1)
			{
				outputStream.write(buffer, 0, bytesRead);
				totalBytesRead += bytesRead;
				percentCompleted = (int) (totalBytesRead * 100 / fileSize);
				
				setProgress(percentCompleted);
			}
			
			outputStream.close();
			
			util.disconnect();
		}
		catch(IOException ex)
		{
			Logger.log(Level.ERROR, "Error downloading file: " + ex.getMessage());
			Logger.log2(Level.ERROR, ex, "Error downloading file");
			ex.printStackTrace();
			setProgress(0);
			cancel(true);
		}
		return null;
	}

Ach ja, der Codeausschnitt, der die ganzen Informationen wie Content-Lenght erstellt hat:
Java:
		String disposition = httpConn.getHeaderField("Content-Disposition");
			String contentType = httpConn.getContentType();
			contentLength = httpConn.getContentLength();
			
			if(disposition != null)
			{
				// extracts file name from header field
				int index = disposition.indexOf("filename=");
				if(index > 0)
					fileName = disposition.substring(index + 10, disposition.length() - 1);
			}
			else
			{
				// extracts file name from URL
				fileName = fileURL.substring(fileURL.lastIndexOf("/") + 1, fileURL.length());
			}
			
			// output for debugging purpose only
			Logger.log(Level.DEBUG, "Content-Type = " + contentType);
			Logger.log(Level.DEBUG, "Content-Disposition = " + disposition);
			Logger.log(Level.DEBUG, "Content-Length = " + contentLength);
			Logger.log(Level.DEBUG, "fileName = " + fileName);
Damit ihr auch wisst, was was ist:
Java:
contentLength = int
httpConn = HttpURLConnection
fileName = String
fileURL = String

Zudem hätte ich da noch ein zweites Problem: Mir scheint es so, als würde das Programm nicht warten, sondern direkt den letzten Downloadlink downloaden, dabei sollte es eigentlich warten bis der erste Download fertig ist und dann direkt zum zweiten überspringen.
Hat da vielleicht irgendjemand eine Idee? ???:L

Java:
		FileUtil util = new FileUtil();
		List<String> content = null;
		try 
		{
			content = util.readFile("./", "content.txt");
		}
		catch (IOException ex) 
		{
			Logger.log(Level.FATAL, "No download link was found!");
			Logger.log2(Level.FATAL, ex, "No download link was found!");
		}
		
		if(content != null && !content.isEmpty())
			for(int i = 0; i < content.size(); i++)
			{
				downloadURL = content.get(i);
			}

		download(downloadURL, saveDir); // Dies hier ruft den SwingWorker "DownloadTask" auf, woraus ich auch den Code vom ersten Fehler habe (ist ja auch die selbe Datei xD)

Ich hoffe ihr könnt mir hierbei helfen. Ich verwende übrigens Java 8. Vielleicht fällt euch nebenbei noch ein, was ich an dem hier geposteten Code verbessern kann. 😉
JavaGamer
 
Zuletzt bearbeitet:
Code:
[ERROR] Error downloading file: C:\Users\Patrick\AppData\Roaming\.minecraft\mods\[1.7.10]TerraFirmaCraft-0.79.18.673.jar"; filename*=UTF-8''%5B1.7.10%5DTerraFirmaCraft-0.79.18.673.ja (Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch)
[ERROR] There was a problem!
java.io.FileNotFoundException: C:\Users\Patrick\AppData\Roaming\.minecraft\mods\[1.7.10]TerraFirmaCraft-0.79.18.673.jar"; filename*=UTF-8''%5B1.7.10%5DTerraFirmaCraft-0.79.18.673.ja (Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch)

Die Fehlermeldung sagt doch eh viel aus -> Es gibt ein Problem mit dem Pfad (existiert dieser?), dem Dateinamen (unerlaubte Zeichen?)
Was mich bei dem Log etwas irritiert "Error downloading file: C:\" schaut für mich aus als ob er die Datei von der C-Platte downloaden will und nicht aus dem Internet 😉

Zudem hätte ich da noch ein zweites Problem: Mir scheint es so, als würde das Programm nicht warten, sondern direkt den letzten Downloadlink downloaden, dabei sollte es eigentlich warten bis der erste Download fertig ist und dann direkt zum zweiten überspringen.
Hat da vielleicht irgendjemand eine Idee? ???:L

Java:
	if(content != null && !content.isEmpty())
			for(int i = 0; i < content.size(); i++)
			{
				downloadURL = content.get(i);
			}

		download(downloadURL, saveDir); // Dies hier ruft den SwingWorker "DownloadTask" auf, woraus ich auch den Code vom ersten Fehler habe (ist ja auch die selbe Datei xD)

Dieser Aufruf sorgt ja nur dafür das der Code in einen eigenen Thread im Hintergrund läuft damit du die UI aktualisieren kannst.
Aber wo ist der Code der darauf wartet das die komplette Datei geladen wurde? (Vielleicht habe ich den nur übersehen)

Außerdem steht der Aufruf nicht in der Schleife, daher wird immer nur die letzte Datei in der Liste geladen 😉
 
Zuletzt bearbeitet:
Ähm, ja, einen Code der darauf wartet das die komplette Datei gedownloadet wurde gibt es nicht. Ich hätte auch keine Ahnung wie ich dies umsetzten soll. Nun ja, damals war in dem Code sogar noch ein Auto-Updater enthalten, der die Download-Liste aktualisiert, der aber wieder entfernt wurde, da aus dem schönen lesbarem Code danach ein Code wurde wo ich keine Ahnung mehr hatte wo was ist und es ein reines durcheinander geworden war....

Habe jetzt mal den Log einwenig editiert im Code und es dann nochmal versucht:

Log1 (bei einem funktionierendem Link):
Code:
[DEBUG] download URL: http://addons-origin.cursecdn.com/files/2231/898/twilightforest-1.7.10-2.3.5.jar
[DEBUG] directory save file: C:\Users\Patrick\AppData\Roaming\.minecraft\mods
[DEBUG] Content-Type = application/java-archive
[DEBUG] Content-Disposition = null
[DEBUG] Content-Length = 3584065
[DEBUG] fileName = twilightforest-1.7.10-2.3.5.jar

Und hier der Log wenn es nicht funktioniert:
Code:
[DEBUG] download URL: https://dl.dropboxusercontent.com/u/57913086/TFC/Build%2079/%5B1.7.10%5DTerraFirmaCraft-0.79.18.673.jar
[DEBUG] directory save file: C:\Users\Patrick\AppData\Roaming\.minecraft\mods
[DEBUG] Content-Type = application/java-archive
[DEBUG] Content-Disposition = inline; filename="[1.7.10]TerraFirmaCraft-0.79.18.673.jar"; filename*=UTF-8''%5B1.7.10%5DTerraFirmaCraft-0.79.18.673.jar
[DEBUG] Content-Length = 18873862
[DEBUG] fileName = [1.7.10]TerraFirmaCraft-0.79.18.673.jar"; filename*=UTF-8''%5B1.7.10%5DTerraFirmaCraft-0.79.18.673.ja
[ERROR] Error downloading file: https://dl.dropboxusercontent.com/u/57913086/TFC/Build%2079/%5B1.7.10%5DTerraFirmaCraft-0.79.18.673.jar
[ERROR] There was a problem!
java.io.FileNotFoundException: C:\Users\Patrick\AppData\Roaming\.minecraft\mods\[1.7.10]TerraFirmaCraft-0.79.18.673.jar"; filename*=UTF-8''%5B1.7.10%5DTerraFirmaCraft-0.79.18.673.ja (Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch)
	at java.io.FileOutputStream.open0(Native Method)
	at java.io.FileOutputStream.open(Unknown Source)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at shadowdragon.installer.task.DownloadTask.doInBackground(DownloadTask.java:52)
	at shadowdragon.installer.task.DownloadTask.doInBackground(DownloadTask.java:1)
	at javax.swing.SwingWorker$1.call(Unknown Source)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at javax.swing.SwingWorker.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Was ich mich ja gerade frage ist, was ist das ganze hinter dem filename. ???:L
Ich vermute mal dass es deshalb nicht funktioniert, aber ich weiß nicht wie ich dies beheben soll, da beim anderen Download funktioniert es ja und der Code ist der selbe, nur die Website eine andere und der Link ein anderer.
 
Ähm, ja, einen Code der darauf wartet das die komplette Datei gedownloadet wurde gibt es nicht. Ich hätte auch keine Ahnung wie ich dies umsetzten soll.

Naja wenn es so einen Code nicht gibt, warum erwartest du dann diese Verhalten?

Ansonsten den Hinweis gelesen das der Aufruf von "download" nicht Teil der Schleife ist und daher nur 1 Datei wirklich geladen wird?
 
So, ich habe jetzt durch löschen des Codes mit disposition und contentType den Fehler behoben. Nun gibt es keine Probleme mehr. 🙂

Also, zum Thema mehrfach download: Den Hinweis mit der Schleife habe ich gelesen und nun getestet. Es funktioniert fast. Es wird zwar die entsprechende Datei gedownloadet allerdings meint das Tool noch währrend des Downloads von Datei 1, es müsse den Namen der zu downloadenen Datei auf den Namen der zweiten Datei ändern in der GUI.

Irgendeine Idee, wie ich das Programm dazu bringe solange zu warten, bis der erste Download vollständig abgeschlossen ist und erst dann die URL des zweiten Downloads einzulesen?

EDIT: Mir ist gerade noch aufgefallen, die erste von zwei Dateien wurde auch nicht zuende gedownloadet, da der anscheinend die for-Schleife wieder gestartet hatte, bevor die erste Datei fertig heruntergeladen war.
 
Zuletzt bearbeitet:
Also, zum Thema mehrfach download: Den Hinweis mit der Schleife habe ich gelesen und nun getestet. Es funktioniert fast. Es wird zwar die entsprechende Datei gedownloadet allerdings meint das Tool noch währrend des Downloads von Datei 1, es müsse den Namen der zu downloadenen Datei auf den Namen der zweiten Datei ändern in der GUI.

EDIT: Mir ist gerade noch aufgefallen, die erste von zwei Dateien wurde auch nicht zuende gedownloadet, da der anscheinend die for-Schleife wieder gestartet hatte, bevor die erste Datei fertig heruntergeladen war.

Wie schon gesagt, diese Verhalten sehe ich nicht im Code daher wusste ich nicht warum du vermutest das es sich so verhalten sollte 😉
Da die Schleife nicht darauf wartet bis eine Datei fertig geladen wurde wird die Methode X mal aufgerufen, daher wird der Name der Datei einfach X mal geändert obwohl noch kein Download abgeschlossen ist.


Irgendeine Idee, wie ich das Programm dazu bringe solange zu warten, bis der erste Download vollständig abgeschlossen ist und erst dann die URL des zweiten Downloads einzulesen?

Stichwort:
Thread -> wait/notify
 
Nun ja, es ist keine Vermutung, es ist mir aufgefallen als ich in den Ordner wo die Dateien abgespeichert waren hinengeschaut habe. Die erste Datei war zu 25% vorhanden, die zweite zu 100% und da der ja mittem im Download von der ersten Datei bereits den Namen geändert hatte --> heißt also, der hat einfach den Download von Datei 1 abgebrochen und den von Datei 2 gestartet.

Und wie baue ich das mit wait und notify dort ein?
Java:
		if(content != null && !content.isEmpty())
			for(int i = 0; i < content.size(); i++)
			{
				downloadURL = content.get(i);
				
				// validate input first
				if(downloadURL.equals(""))
				{
					Logger.log(Level.ERROR, "No download URL was found!");
					return;
				}
				
				if(saveDir.equals(""))
				{
					Logger.log(Level.FATAL, "No directory save file was found!");
					return;
				}
				
				download(downloadURL, saveDir);
			}
[/Java]

Sobald ich unter "download(downloadURL, saveDir);" die Methode wait() einfüge entsteht eine Fehlermeldung:
java.lang.IllegalMonitorStateException

Diese verweist nebenbei bemerkt auf die Methode wait. Manchmal frage ich mich ja warum es nicht einfach mal Fehlermeldungen geben kann wo jeder direkt weiß was falsch ist... aber bei anderen Sprachen wie C++ ist das ja noch schlimmer...
 
Zuletzt bearbeitet:

Zurück
Oben