Cet article partage le code spécifique pour les fichiers de téléchargement par lots de fond Java et les compresser en téléchargements zip pour votre référence. Le contenu spécifique est le suivant
En raison des besoins du projet, les fichiers d'image sur le serveur sont compressés et emballés et téléchargés sur le bureau local.
Premièrement, frontal JS:
fonction doReryPic () {var picsDate = $ ("# picsDate"). Val (); var pianodate = $ ("# picdate"). Val (); var picInst = $ ("# pic_inst"). combotree ("getValue"); var svrcode = $ ("# pic_svr_code"). val (); var picStime = $ ("# pic_stime"). Val (); var pianoTime = $ ("# pic_etime"). Val (); if (svrcode == null) {$ .messager.Alert ('hint', "Veuillez saisir le code de requête de transaction"); retour; } else {$ .ajax ({type: "post", url: 'querypic.translog.action', data: {f_brno: picinst, f_sdate: picsDate, f_edate: picdate, f_svr_code if (rcdata.success) {var rows = rcdata.picInfo; Tous </ th> <th style = 'width: 10%; text-align: Center'> Date </ th> <th style = 'width: 10%; text-align: Center'> Date </ th> <th style = 'width: 10%; text-align: Center'> y a-t-il une image </ th> <th style = 'width: 23%; Text-adign: Center'> Trading NAD </ th> <th style = 'wide: Text-Align: Center'> Trading NAD </ Th> <th style = 'wide; Text-Align: Center'> Trading Name </ Th> <TH style = 'Wide; 10%; Text-Align: Center '> Statut de trading </th> <th style =' width: 12%; text-align: Center '> Numéro de périphérique </th> <th style =' width: 10%; Text-Align: Center '> Trading Code </ Th> <Th style =' Width: 10% Time </th> </tr> </ thead> <tbody> "; for (var i = 0; i <rows.length; i ++) {de détailhtml = de détailhtml +" <tr> <td align = 'Center'> <entrée = 'Checkbox' name = 'PictureId' Value = '"+ Rows [i] .f_date + rows [i]. /> </ td> <td> "+ lignes [i] .f_date +" </td> <td> "+ lignes [i] .ishasimg +" </td> <td> "+ lignes [i] .f_tx_name +" </td> <td> "+ lignes [i] .f_stus +" </td> <td> "+ lignes [i] .f_stus +" </td> lignes [i] .f_dev_id + "</td> <td>" + lignes [i] .f_svr_code + "</td> <td>" + lignes [i] .f_svr_code + "</td> <td>" + lignes [i] .f_brno + "</td> <td> "</ td> </ tr>";} Detailhtml = DetailHtml + "</ tbody> </ table }}); }}}Le code ci-dessus s'affiche sur l'interface après avoir interrogé les données pertinentes, puis selon les besoins du client, vous pouvez choisir les données à télécharger et à enregistrer.
Joindre la boîte à cocher Sélectionnez tout / Annuler Sélectionnez tout le code JS
// Checkbox Sélectionnez All / Annuler Sélectionnez tous les var isCheckall = false; fonction swapcheck () {if (isCheckall) {$ ("input [type = 'checkbox']"). Chaque (fonction () {this.checked = false;}); ischeckall = false; } else {$ ("input [type = 'checkbox']"). Chaque (fonction () {this.checked = true;}); isCheckall = true; }} Le code suivant est utilisé pour l'interaction d'arrière-plan. Veuillez me rappeler que si vous téléchargez des fichiers, n'utilisez pas Ajax pour envoyer des données. Je l'ai déjà fait et je n'ai pas pu le télécharger. Je ne l'ai découvert qu'après une journée entière. La partie de commentaire est le code AJAX. Vous pouvez y jeter un œil comme une référence:
Fonction DownloadPic () {var Arr = new Array (); var picids = document.getElementsByName ("pictureId"); for (i = 0; i <picIdS.length; i ++) {if (picids [i] .Checked) {arr.push (picids [i] .value); }} if (arr.length <= 0) {$ .messager.lerlert ('t inside', "pas de téléchargement de contenu!"); retour; } else {$ ('# formpic'). attr ('action', 'downloadpic.translog.action'); $ ("# formpic"). form ('soumider', {onSubmit: function () {}, succès: function (data) {$ .messager.alert ('hint', 'image téléchargement réussi', 'info');}}); / ** * $. ajax ({type: "post", url: 'downloadpic.translog.action', data: {pictureList: json.strifify (arr)}, succès: function (rcdata) {if (rcdata.success) {$ .messager.show ({title: 'Success', msg: rcdata.errmsg}); } else {$ .Messager.Alert ('hint', rcdata.errmsg);}}, erreur: function () {alert ("Query a échoué!");}}); * /}} Ensuite, l'interaction en arrière-plan, tout d'abord, la couche de contrôle du contrôleur:
/ ** * Téléchargement par lots d'image * @param demande * @param réponse * @return * @throws ioException * / public void downloadPic (httpservletRequest request, httpservletResponse réponse) lance ioException {// map <string, objet> paramrs = getParameters (request); String [] pictureiD = request.getParameTervalues ("pictureId"); Authentification Au = GetAuthentication (demande); Service.DownloadPic (PictureId, Au, demande, réponse); retour ; } Couche de service:
public void downloadPic (String [] Params, Authentication AU, HttpServLetRequest Request, HttpServletResponse Response) lève ioException {// Réglage initial du fichier compressé Path String = System.getProperty ("ics.webapp.root"); // c'est l'adresse de chemin du serveur. filezip = au.getUsername () + "-" + au.getAttribute ("f_brno") + "images.zip"; String filepath = path + "//" + filezip; // puis il est utilisé pour générer un fichier zip // filepatharr est l'ensemble des chemins de fichier PDF obtenus via la requête de la base de données basée sur les informations transmises à partir du premier plan (spécifiquement sur le suffixe) Liste <map <string, objet >> filenArr = new ArrayList <Map <String, objet >> ();); // JSONArray JSONS = JSONArray.FromObject (params.get ("PictureList")); / ** * list <string> pictureids = new ArrayList <string> (); pour (objet obj: json) {pictureId.Add (obj.toString ()); } * / for (int i = 0; i <params.length; i ++) {map <string, object> spemap = new hashmap <string, object> (); spemap.put ("f_date", params [i] .substring (0, 8)); spemap.put ("f_ics_batch", params [i] .SubString (8)); List <map <string, objet >> reclists = dao.queryloginfo (spemap); pour (int j = 0; j <reccistes.size (); j ++) {filenamearr.add (revisis.get (j)); }} // Le fichier doit être compressé par l'adresse du fichier et le nom du fichier // String [] pathtytyt = {"d: //13.jpg", "d: //1212.jpg"}; // l'adresse de fichier compressé et le nom de fichier à générer // string depath = "d: //downloads//new.zip"; File zipfile = nouveau fichier (filepath); ZipOutputStream zipstream = null; FileInputStream zipSource = null; BufferedInputStream BufferStream = NULL; essayez {// construire le flux de sortie du package compressé final zipstream = new ZipOutputStream (new FileOutputStream (zipfile)); for (int i = 0; i <filenamearr.size (); i ++) {file file = new File ((String) filenamearr.get (i) .get ("f_filename")); // file file = new File (pathtyTyt [i]); // Formatez le fichier qui doit être compressé dans le flux d'entrée zipsource = new fileInputStream (fichier); // Les entrées compressées ne sont pas des fichiers indépendants spécifiques, mais la liste des éléments dans la liste des fichiers de package compressé, appelées entrées, tout comme index // le nom ici est le nom du fichier, et la duplication du fichier entraînera une écrasement du fichier. Ici, i plus le nom de fichier est utilisé pour la reconnaissance de fichiers unique Zipentry zipentry = new Zipentry (i + file.getName ()); // Localisez l'emplacement de l'entrée compressée et commencez à écrire le fichier dans le package compressé zipstream.putNextentry (zipentry); // d'entrée bufferstream = new BufferedInputStream (ZipSource, 1024 * 10); int lecture = 0; // Créer un byte de tampon de lecture et d'écriture [] buf = nouveau octet [1024 * 10]; while ((read = buffStream.read (buf, 0, 1024 * 10))! = -1) {zipstream.write (buf, 0, lecture); }}} catch (exception e) {e.printStackTrace (); } Enfin {// Fermez le flux try {if (null! = BufferStream) Bufferstream.close (); if (null! = zipstream) zipstream.close (); if (null! = zipSource) zipsource.close (); } catch (ioException e) {e.printStackTrace (); }} / ** * Écrivez un fichier de flux dans le navigateur frontal servletOutputStream os = réponse.getOutputStream (); Response.SetContentType ("Application / X-Octet-Stream"); réponse.setContentLength ((int) zipfile.length ()); réponse.addheader ("contenu-disposition", "pièce jointe; filename =" + urlencoder.encode (filezip, "utf-8")); BufferedInputStream bis = null; BuffredOutputStream bos = null; try {bis = new BufferedInputStream (new FileInputStream (filepath)); BOS = nouveau tampondOutputStream (OS); octet [] buff = nouveau octet [2048]; int bytesread; while (-1! = (bytesRead = bis.read (buff, 0, buff.length))) {bos.write (buff, 0, bytesRead); } os.flush (); os.close (); } catch (ioException e) {throw e; } Enfin {if (bis! = Null) bis.close (); if (bos! = null) bos.close (); Fichier obj = nouveau fichier (filepath); if (obj.exists ()) {obj.delete (); // Supprimer les fichiers compressés temporaires générés localement par le serveur}} * / // Télécharger le navigateur // Obtenir des informations proxy du navigateur final chaîne userAgent = request.getheader ("user-agent"); // juge le proxy du navigateur et définir le format de codage qui répond respectivement au navigateur finalFileName = null; if (stringUtils.contains (userAgent, "msie") || stringUtils.contains (userAgent, "Trident")) {// ie Browser finalFileName = urlencoder.encode (filezip, "utf-8"); System.out.println ("IE Browser"); } else if (stringUtils.contains (userAgent, "mozilla")) {// google, Firefox Browser finalFileName = urlencoder.encode (filezip, "utf-8"); } else {finalFileName = urlencoder.encode (filezip, "utf-8"); // autres navigateurs} réponse.setContentType ("application / x-octtet-stream"); // dire au navigateur de télécharger le fichier au lieu de l'ouvrir directement. Le navigateur ouvre par défaut la réponse.sethEader ("Content-Disposition", "pièce jointe; filename =" + finalFileName); // le nom du fichier de téléchargement servletOutStream servletOutStream = réponse.getOutputStream (); DataOutputStream temps = new DataOutputStream (servletOutputStream); DatAnputStream dans = new DatainputStream (new FileInputStream (filepath)); // le chemin du navigateur de téléchargement de téléchargement de fichier [] b = nouveau octet [2048]; Fichier reportzip = new File (filepath); // puis il est utilisé pour supprimer le fichier compressé temporaire try {while ((in.read (b))! = -1) {temps.write (b); } temps.flush (); } catch (exception e) {e.printStackTrace (); optlogsvc.savelog (Au.getUsername (), Au.getAttribute ("f_brno"), au.getAttribute ("f_lstip"), toptlogService.type_mr, "", au.getUsername () + "Batch download image" + filezip + "a échoué!"); } enfin {if (temps! = null) temps.close (); if (in! = null) in.close (); if (reportZip! = null) reportzip.delete (); // Supprimer le fichier compressé temporaire généré localement par le serveur servletOutStream.close (); } / ** * if (picInfollist.size ()> 0) {rc.put ("Success", true); rc.put ("picinfo", picinfollist); optlogsvc.savelog (au.getUsername (), au.getAttribute ("f_brno"), au.getAttribute ("f_lstip"), toptlogService.type_mr, "", au.getUsername () + "Query Batch downlow" + params.get ("f_svr_code") ")") "); } else {rc.put ("succès", false); rc.put ("errmsg", "tests de test"); optlogsvc.savelog (au.getUsername (), au.getAttribute ("f_brno"), au.getAttribute ("f_lstip"), toptlogService.type_mr, "", au.getUsername () + "Query Batch downlow" + params.get ("f_svr_code") ")"); } 11 retour ; }Il y a un problème avec le format de conversion du tableau JSON. Si le JSON envoyé à partir du frontal JSON est formaté par JSON.Strification, il doit être analysé de cette manière lorsque vous allez à l'arrière-plan.
Mes compétences en disposition ne sont pas bonnes, alors jetons un coup d'œil. J'ai jugé que le navigateur était copié en ligne, mais j'ai trouvé qu'il était inutile et ne pouvait pas reconnaître le chinois. En fin de compte, j'ai compromis et utilisé l'anglais comme nom de fichier. Si vous rencontrez du code brouillé chinois, vous pouvez rechercher à nouveau sur Baidu. D'autres ont écrit des articles similaires, mais je n'ai pas l'énergie de les étudier.
Il s'agit d'une méthode de compression des fichiers qui existent sur le serveur. J'ai également déjà vu des articles liés à Baidu pour obtenir des images de réseau et des compresser et les télécharger, ce qui est intéressant.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.