Die Beispiele in diesem Artikel teilen den Code zum Herunterladen von Java -Haltepunkten für Ihre Referenz. Der spezifische Inhalt ist wie folgt
1. Java -Code
// Datei implementieren downloadFile () {Datei dire = new Datei (filepath); // Dateipfad abrufen if (! Dir.exists ()) {System.out.println ("Dateipfad -Fehler"); log.debug ("Dateipfad -Fehler"); Rückgabe "fehlgeschlagen"; // Anweisung, ob eine Datei oder ein Ordner existiert} Datei downloadFile = new Datei (DIR, Dateiname); // Suchen Sie nach Datei if (! Dir.isfile ()) {System.out.println ("Datei existiert nicht"); log.debug ("Datei existiert nicht"); Rückgabe "fehlgeschlagen"; // Bestimmen Sie, ob die Datei oder der Ordner existieren} Versuchen Sie {downloadFileranges (DownloadFile); } catch (clientabortexception e) {System.out.println ("Verbindung beendet"); log.debug ("Verbindung terminiert"); } catch (ioException e) {e.printstacktrace (); } return null; } private void downloadFileranges (Datei downloadFile) löst IOException {// Dateigröße aus, um long filelength = downloadFile.length () herunterzuladen; // Dateigröße lange abgeladener Vergangenheit = 0; // ob der Expresszug heruntergeladen werden soll, sonst ist es Donner oder ein anderer boolean isFlashget = true; // Wird verwendet, um die Anzahl der Endbytes aufzuzeichnen, die heruntergeladen werden müssen (Donner oder andere Downloads) long lenend = 0; // verwendet, um die vom Client zum Herunterladen von String RangeByTes = Request.Getheader ("Bereich") erforderliche Datenbereichszeichenfolge ("Bereich") zu erfassen; // verwendet, um Dateien zufällig zu lesen und zu schreiben, randomAccessfile RAF = NULL; OutputStream os = null; OutputStream output = null; Byte B [] = neues Byte [1024]; // Wenn die Client -Download -Anforderung den Bereich if (null! = RangeBytes) {// Return Code 206 response.setStatus (httpServletResponse.sc_partial_content) enthält; RangeByTes = Request.Getheader ("Bereich"). Ersatz ("bytes =", ""); // Richter Range String -Modus if (RangeBytes.indexof (' -') == RangeByTes.length () - 1) {// Es gibt keine End -Byte -Nummer, schnelle isFlashget = true; RANGEBYTES = RANGEBYTES.SUBSTRING (0, RANGEBYTES.INDEXOF ('-')); pastLength = long.parselong (RangeBytes.trim ()); } else {// Thunder Download isFlashget = false; String startBytes = RangeByTes.substring (0, RangeBytes.Indexof ('-')); String endBytes = RangeByTes.substring (RangeBytes.Indexof ('-') + 1, RangeBytes.length ()); // Downloaded Dateisegment PastLength = long.parselong (startBytes.trim ()); // die Anzahl der Datei -Bytes, die heruntergeladen werden müssen (starten Sie aus dem heruntergeladenen Dateisegment) lenend = long.parselong (EndBytes); }} // benachrichtigen Sie den Client, damit die Haltepunkte kontinuierlich übertragen werden können. Das Antwortformat lautet: Accept-Ranges: Bytes Response // response.reset (); // Wenn es sich um den ersten Download handelt, stand der Status von 200 und das Antwortformat: http/1.1 200 OK if (0! = PastLength) {// Inhaltsbereich String String contentRange = ""; // Antwortformat // Inhaltsbereich: Bytes [Start Byte des Dateiblocks]-[Gesamtgröße von Datei-1] || [Gesamtgröße der Datei] if (isFlashget) {contentRange = new StringBuffer ("Bytes") .Append (new long (pastLegth) .toString ()). Append ("-"). .Append ("/"). append (neu long (filelength) .toString ()) .toString (); } else {contentRange = new StringBuffer (RangeBytes) .Append ("/") .Append (new Long (filelength) .toString ()). toString (); } response.setheader ("Content-Range", contentRange); } String Dateiname = getdownloadChineseFileName (Dateiname); response.setheader ("Inhaltsdisposition", "Anhang; Dateiname =" + Dateiname + ""); // Das Format der Antwort lautet: Antwort. Response.addHeader ("Inhaltslänge", String.Valueof (FileLength)); try {os = response.getOutputStream (); output = new bufferedOutputStream (OS); RAF = New RandomAccessfile (DownloadFile, "R"); // Download -Bytes Raf.seek (PastLength) überspringen; if (isFlashget) {// express usw. int n = 0; while ((n = raf.read (b, 0, 1024))! = -1) {output.write (b, 0, n); }} else {// Thunder usw. while (raf.getFilepointer () <lenend) {output.write (raf.read ()); }} output.flush (); } catch (ioException e) { /*** Wenn Daten geschrieben werden, werden Ausnahmen wie Clientabortexception* geworfen, da der Client den Download abbricht und der Server weiterhin Daten in den Browser schreibt. Das ist normal. Besonders für blutsaugende Kundensoftware wie Donner. * Es gibt offensichtlich einen Thread-Lesebytes = 1275856879-1275877358. * Wenn die Lesung nicht in kurzer Zeit abgeschlossen ist, startet Thunder erneut die zweite und dritte. . . Der Thread liest das gleiche Byte -Segment, bis ein Thread abgeschlossen ist. Thunder tötet * andere Threads, die das gleiche Byte -Segment herunterladen, das das Lesen des Byte gewaltsam abbricht und der Server die Clientabortexception wirft. * Also ignorieren wir diese Ausnahme*/} endlich {if (output! = Null) {output.close (); } if (raf! = null) {raf.close (); }}} private String getdownLoadChineseFileName (String -ParamName) {String downloadChineSefileName = ""; try {downloadChineseFileName = new String (paramname.getBytes ("gbk"), "iso8859-1"); } catch (unportedenCodingException e) {e.printstacktrace (); } return downloadChineseFileName; } public String getFilePath () {return filepath; } public void setfilepath (String filepath) {this.filepath = filepath; } public String getFileName () {return Dateiname; } public void setFileName (String Dateiname) {this.FileName = Dateiname; } public httpServletRequest getRequest () {Rückgabeanforderung; } public httpServletResponse getResponse () {Rückgabeantwort; } 2. Struts Abschnitt <br /> Kopieren Sie den Code wie folgt: <Action name = "downloadFile" method = "downloadFile">
<result name = "fehlgeschlagen" type = "redirectAction"> showdownloadFilenamelist </result>
</action>
3. JSP -Teil
Die Codekopie lautet wie folgt: <td> <a href = "downloadFile? FileName = $ {fileMap.key} && filepath = $ {fileMap.value}"> Datei Download </a> </td>