mardi 5 mai 2015

Java Dateidownload klappt bei einigen Datein nicht

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: http://ift.tt/1zxibBX
[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 Code:

  1. /**
  2. * Executed in background thread
  3. */
  4. @Override
  5. protected Void doInBackground() throws Exception
  6. {
  7. try
  8. {
  9. HTTPDownloadUtil util = new HTTPDownloadUtil();
  10. util.downloadFile(downloadURL);
  11.  
  12. // set file information on the GUI
  13. gui.setFileInfo(util.getFileName(), util.getContentLength());
  14.  
  15. String saveFilePath = saveDirectory + File.separator + util.getFileName();
  16.  
  17. InputStream inputStream = util.getInputStream();
  18. // opens an output stream to save into file
  19. FileOutputStream outputStream = new FileOutputStream(saveFilePath); // Line 52
  20.  
  21. byte[] buffer = new byte[BUFFER_SIZE];
  22. int bytesRead = -1;
  23. long totalBytesRead = 0;
  24. int percentCompleted = 0;
  25. long fileSize = util.getContentLength();
  26.  
  27. while((bytesRead = inputStream.read(buffer)) != -1)
  28. {
  29. outputStream.write(buffer, 0, bytesRead);
  30. totalBytesRead += bytesRead;
  31. percentCompleted = (int) (totalBytesRead * 100 / fileSize);
  32.  
  33. setProgress(percentCompleted);
  34. }
  35.  
  36. outputStream.close();
  37.  
  38. util.disconnect();
  39. }
  40. catch(IOException ex)
  41. {
  42. Logger.log(Level.ERROR, "Error downloading file: " + ex.getMessage());
  43. Logger.log2(Level.ERROR, ex, "Error downloading file");
  44. ex.printStackTrace();
  45. setProgress(0);
  46. cancel(true);
  47. }
  48. return null;
  49. }


Ach ja, der Codeausschnitt, der die ganzen Informationen wie Content-Lenght erstellt hat:
Java Code:

  1. String disposition = httpConn.getHeaderField("Content-Disposition");
  2. String contentType = httpConn.getContentType();
  3. contentLength = httpConn.getContentLength();
  4.  
  5. if(disposition != null)
  6. {
  7. // extracts file name from header field
  8. int index = disposition.indexOf("filename=");
  9. if(index > 0)
  10. fileName = disposition.substring(index + 10, disposition.length() - 1);
  11. }
  12. else
  13. {
  14. // extracts file name from URL
  15. fileName = fileURL.substring(fileURL.lastIndexOf("/") + 1, fileURL.length());
  16. }
  17.  
  18. // output for debugging purpose only
  19. Logger.log(Level.DEBUG, "Content-Type = " + contentType);
  20. Logger.log(Level.DEBUG, "Content-Disposition = " + disposition);
  21. Logger.log(Level.DEBUG, "Content-Length = " + contentLength);
  22. Logger.log(Level.DEBUG, "fileName = " + fileName);

Damit ihr auch wisst, was was ist:
Java Code:

  1. contentLength = int
  2. fileName = String
  3. 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 Code:

  1.  
  2. FileUtil util = new FileUtil();
  3. List<String> content = null;
  4. try
  5. {
  6. content = util.readFile("./", "content.txt");
  7. }
  8. catch (IOException ex)
  9. {
  10. Logger.log(Level.FATAL, "No download link was found!");
  11. Logger.log2(Level.FATAL, ex, "No download link was found!");
  12. }
  13.  
  14. if(content != null && !content.isEmpty())
  15. for(int i = 0; i < content.size(); i++)
  16. {
  17. downloadURL = content.get(i);
  18. }
  19.  
  20. 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


Java Dateidownload klappt bei einigen Datein nicht

0 commentaires:

Enregistrer un commentaire