Datei -Upload und Download sind häufig in der Webentwicklung aufgetretenen Probleme. In den letzten Tagen wurde der Datei -Download in einem Projekt verwendet. Ich habe auch schon einige Notizen auf verstreute Weise gemacht. Heute werde ich es organisieren. Das Hochladen von Dateien muss weiter getestet werden. Lassen Sie uns zuerst über Datei herunterladen.
1. Datei -Download -Verarbeitungsprozess
Der Datei -Download -Prozess ist tatsächlich sehr klar, dh:
1. Suchen Sie die Dateien basierend auf Dateinamen oder Dateipfad. Die spezifische Strategie basiert hauptsächlich auf Ihren eigenen Bedürfnissen. Kurz gesagt, der vollständige Pfad der Dateien, die das System finden kann, ist erforderlich.
2. Erhalten Sie den Eingabestream und erhalten Sie den Eingabestream aus der Zieldatei.
3. Holen Sie sich den Ausgangsstrom und holen Sie sich den Ausgangsstrom aus der Antwort.
4. Lesen Sie die Datei aus dem Eingabestream und geben Sie die Datei über den Ausgabestream aus. Dies ist der echte Download -Ausführungsprozess.
5. Schalten Sie den IO -Stream aus.
Dies ist der Hauptprozess, und es gibt einige notwendige Attributeinstellungen, wie den wichtigeren ContentType -Typ der Einstellungsdatei usw.
2. Sprich nicht mehr, füge den Code hinzu
Ich habe es mit SpringMVC gemacht, aber tatsächlich gilt das gleiche für andere Dinge. Ich brauche hauptsächlich ein httpServletResponse -Objekt und eine gültige Zieldatei.
1. Code Rezeption
/** Laden Sie die hochgeladene Datei herunter*/Funktion downloadFromUpload (Dateiname) {window.location.href = path + "/download? DIR = upload & fileName =" + cododeuri (cnodeuri (Dateiname));}/** normaler Download*/Funktion Download (FileName) {window.location.loc. "/Download? Dir = download & fileName ="+cododeuri (codoRi (Dateiname));}2. Controller -Code
/*** Datei herunterladen (Download vom Upload -Pfad hochladen)** @param request* @param response* @throws ioException*/ @responseBody @requestmapPing (value = "/download") public void downloadFile (httpServletRetRetRetRetRetRetRetReping, httpServletRespectRepuls, Filmeemodel). "UTF-8");/** Beschränken Sie nur Dateien in den Upload- und Download-Ordnern herunterladen*/String-Ordnername = "download"; if (! Stringutils.isempty (model.getDir ()) && model Request.GetSession (). getServletContext (). getRealPath ("/")+ "/web-inf/"+ foldName+ "/"+ fileName; Filetools.downloadFile (Anfrage, Antwort, FileAbSolutepath); log.warn ("userId:"+ (Integer) (Anfrage) (). (Request.GetSession (). getAtTribute ("Benutzername")) + ", heruntergeladene Datei:" + fileAbSolutepath);}Die Download -Logik hier ist, dass die Rezeption nur die Parameter Dateinamen anfordern/herunterladen und angeben muss. Um den chinesischen verstümmelten Code zu vermeiden, verwendet der Vordergrund -Dateiname als Parameter, er verwendet JS 'Encodeuri (), um ihn in den Unicode -Code zu ändern und dann in Chinesisch zu dekodieren. Aufgrund der besonderen Art des Projekts können die Dateien, die ich hier herunterladen möchte, möglicherweise in den Upload- und Download -Ordnern enthalten, sodass hier einen Teil der Urteilslogik vorhanden ist. Zusätzlich verkapuliere ich sowohl den Dateinamen als auch den angeforderten Ordnernamen in Filemodel.
3.. Logische Implementierung herunterladen.
Hier gibt es keinen Service, der jedoch direkt mit statischen Methoden implementiert wird.
/*** Geben Sie den Name Download beim Herunterladen der Datei an** @param appell String -Filepath, String -Dateiname) löscht IOException {bufferedInputStream bis = null; bufferedOutputStream bos = null; Bis = new BufERDInputStream (new FileInputStream (filePath)); bos = new BufferedOutputStream (response.getOutputStream ()); Datei (Filepath) .Length (); Antwort fileName.getBytes (): Dateiname.getBytes ("utf-8"); // Dateiname.getBytes ("UTF-8") behandelt krankende Codeprobleme in Safari Dateiname = new String (Bytes ", ISO-8859-1"); // Alle Browser unterstützen im Grunde genommen die ISO-Codierungsreaktion. bis @throws ioException*/public static void downloadFile (httpServletRequest -Anforderung, httpServletResponse -Antwort, String -Filepath) löst IOException {Datei Datei = neue Datei (Filepath); DownloadFile (Anfrage, Antwort, Filepath, Datei.getName ()) aus;};};};};};};};};Hier ist eine überlastete Download -Methode, um die Notwendigkeit zu lösen, den vom Client heruntergeladenen Dateinamen anzugeben.
3.. Dinge zu beachten
1. über die Wahl des MIME -Typs
Ich wusste vorher nicht viel über MIME -Typen, aber ich stellte fest, dass es viele heruntergeladene Quellcodes im Internet gibt, die unterschiedliche Einstellungen haben. Das ist dieser Satz
response.setContentType ("Multipart/Form-Data");Ich habe überprüft, ob eine der Funktionen beim Einstellen des MIME -Typs hier darin besteht, den Client -Browser zu sagen, dass er die Datei in welchem Format herunterladen soll. Es gibt viele Erklärungen auf der spezifischen entsprechenden Website. Wenn diese Art der Klasse I in diesem Format festgelegt ist, wird das Format im Allgemeinen automatisch übereinstimmt.
2. Geben Sie den Namen des Client -Downloaddateins an
Manchmal müssen wir möglicherweise den Dateinamen angeben, wenn der Client die Datei herunterlädt, dh diesen Code
response.setheader ("Inhaltsdisposition", String.format ("Anhang; Dateiname =/"%s/"", Dateiname));
Dateiname darin kann angepasst werden. Der vordere Teil sollte nicht bewegt werden.
3. Lösen Sie das Problem des verstümmelten Chinesens
Es ist zu häufig, dass chinesische Dateien verstümmelt werden. Wenn die Projektsystemarchitektur erstmals erstellt wird, sollten alle chinesischen Codierungen einheitlich sein, einschließlich der Editor, Seite und Datenbank. Die UTF-8-Codierung wird empfohlen. Wenn Sie Spring verwenden, können Sie auch den Charakter -Set -Filter des Spring -Zeichens konfigurieren, um den chinesischen verstümmelten Code weiter zu vermeiden.
(1) Der Dateinamen des Client -Download -Anforderungsvorgangs ist verstümmelt
Manchmal begegnen wir es. Wenn auf der Seite der Rezeption die Liste der chinesischen Dateinennamen heruntergeladen wird, ist sie normal, aber wenn wir zum Hintergrund gehen, stellen wir fest, dass der Dateiname in der Anforderung verstümmelt ist. Zu diesem Zeitpunkt können wir die oben genannten Encodeuri verwenden, um das Problem zu lösen.
(2) Dateinamen, der verstümmelt ist, wenn der Client heruntergeladen und ausgeführt wird
In den tatsächlichen Tests wurde festgestellt, dass der chinesische Dateiname unter dem IE verstümmelt erscheinen kann, wenn andere Browser ausgeführt werden können. Ich habe einen solchen Code online gesehen. Nach dem Testen löste es das Problem der in verschiedenen Browser verstümmelten Chinesen perfekt.
/** Lösen Sie das chinesisch verstümmelte Problem jedes Browsers*/String userAgent = request.getheader ("user-Agent"); byte [] bytes = userAgent.contains ("msie")? fileName.getBytes (): Dateiname.getBytes ("utf-8"); // Dateiname.getBytes ("utf-8") behandelt das verstümmelte Problem von Safari Filename = New String (Bytes ", ISO-8859-1"); // Alle Browser unterstützen im Grunde genommen die ISO-Codierungsantwort.(3) Datei auf dem Server verstümmelt
In Abhängigkeit von der Plattform können sich unterschiedliche Server auch unterschiedlich unterscheiden. Daher müssen Sie hier darauf achten. Für bestimmte Lösungen finden Sie in einem Artikel, den ich zuvor geschrieben habe: Chinesische Verarbeitung während des Herunterladens von Dateien.
Das obige ist die Download der Java -Web -Implementierungsdatei und die vom Editor vorgelegte Verarbeitungsmethode für die Verarbeitungsverarbeitung. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!