Este artículo comparte el código específico para los archivos de descarga de lotes de fondo Java y comprimirlos en descargas zip para su referencia. El contenido específico es el siguiente
Debido a las necesidades del proyecto, los archivos de imagen en el servidor están comprimidos y empaquetados, y se descargan al escritorio local.
Primero, front-end js:
function doQueryPic () {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 ('sugerir', "Ingrese el código de consulta de transacción"); devolver; } else {$ .AJAX ({type: "post", url: 'querypic.translog.action', data: {f_brno: picinst, f_sdate: picsdate, f_edate: picdate, f_svr_code: svrcode, f_stime: picstime, f_etime: pictime}, éxito (rcdates) if (rcdata.success) {var fila = rcdata.picinfo; Todos </th> <th style = 'width: 10%; text-align: Center'> date </th> <th style = 'width: 10%; text-align: centro'> date </th> <th style = 'width: 10%; text-align: centro'> ¿Hay alguna alguna imagen </th> <th style = 'width: 23%; text-alalign: centro'> comercio </th> 10%; text-align: centro '> estado de negociación </th> <th style =' width: 12%; text-align: centro '> número de dispositivo </th> <th style =' width: 10%; text-align: centro '> código de comercio </th> <th style =' width: 10%; text-align: centro '> institución afiliada </th> <th style =' widh: 10%; tiempo </th> </tr> </thead> <tbody> "; for (var i = 0; i <shows.length; i ++) {detallhtml = detallhtml +" <tr> <td align = 'center'> <input type = 'checkbox' name = 'imageID' value = '" + rows [i] .f_date + rows [i] .f_ics /> </td> <td> " + filas [i] .f_date +" </td> <td> " + filas [i] .ishasimg +" </td> <td> " + filas [i] .f_tx_name +" </td> <td> " + ROWS [i] .f_stus +" </td> <td> " +" + filas [i] .f_dev_id + "</td> <td>" + filas [i] .f_svr_code + "</td> <td>" + filas [i] .f_svr_code + "</td> <td>" + ROWS [i] .F_BRNO + "</td> <td>" + Rows [i]. "</td> </tr>"; }); }}}El código anterior se muestra en la interfaz después de consultar los datos relevantes, y luego, de acuerdo con las necesidades del cliente, puede elegir qué datos de datos descargar y guardar.
Adjuntar casilla de verificación Seleccione todo/Cancelar Seleccione todo el código JS
// casilla de verificación Seleccione All/Cancel Seleccione All VAR isCheckall = false; Function SwapCheck () {if (isCheckall) {$ ("input [type = 'checkbox']"). Cada (function () {this.ecked = false;}); ischeckall = false; } else {$ ("input [type = 'CheckBox']"). Cada (function () {this.ecked = true;}); ischeckall = true; }} El siguiente código se usa para la interacción en segundo plano. Recuerde que si descarga archivos, no use AJAX para enviar datos. Lo hice antes y no pude descargarlo. Solo lo descubrí después de un día entero. La parte del comentario es el código AJAX. Puede echarle un vistazo como referencia:
function downloadPic () {var arr = new Array (); var picids = document.getElementsByName ("imageId"); para (i = 0; i <picids.length; i ++) {if (picids [i] .ecked) {arr.push (picids [i] .value); }} if (arr.length <= 0) {$ .messager.alert ('t indic', "¡Sin contenido de descarga!"); devolver; } else {$ ('#formpic'). attr ('Action', 'downloadPic.translog.action'); $ ("#formpic"). Form ('enviar', {onsubMit: function () {}, éxito: function (data) {$ .messager.alert ('tint', 'imagen descarga de imagen exitosa', 'info');}}); /***$. Ajax ({type: "post", url: 'downloadpic.translog.action', data: {pockureList: json.stringify (arr)}, éxito: function (rcData) {if (rcData.success) {$. $ .messager.alert ('sugerir', rcdata.errmsg); */}} La siguiente es la interacción de fondo, en primer lugar, la capa de control del controlador:
/** * Descarga de lotes de imagen * @param Solicitud * @param respuesta * @return * @throws ioexception */public void downloadPic (httpservletRequest request, httpServletResponse respuesta) lanza ioexception {// map <string, object> params = getParameters (solicitud); Cadena [] imageIds = request.getParametervalues ("imageId"); Autenticación au = getAuthentication (solicitud); servicio.downloadPic (PictureIds, Au, Solicitud, respuesta); devolver ; } Capa de servicio:
Public void downloadPic (String [] params, autenticación au, solicitud httpservletRequest, httpservletResponse respuesta) lanza ioexception {// configuración inicial de la string de archivo comprimido ruta = system.getProperty ("ics.webapp.root"); // Esta es la dirección de ruta del servidor, request.getSession (). ser usado string filezip = au.getusername ()+"-"+au.getattribute ("f_brno")+"Pictures.zip"; String filePath = path + "//" + filezip; // Luego se usa para generar un archivo zip // filePatharr es el conjunto de rutas de archivo PDF obtenidas a través de la consulta de la base de datos basada en la información transmitida desde el primer plano (específicamente a la lista) listar <map <string, object >> filenamearr = new arraylist <map <string, objeto >> (); // JSONArray JSons = JSONArray.FromObject (params.get ("PictureList")); /***Lista <String> PictureIds = new ArrayList <String> (); para (objeto obj: jsons) {pictureIds.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, object >> reclists = dao.queryLoginfo (spemap); para (int j = 0; j <reccists.size (); j ++) {filenamearr.add (recists.get (j)); }} // El archivo que debe comprimirse, incluida la dirección del archivo y el nombre del archivo // string [] pathtytyt = {"d: //13.jpg", "d: //1212.jpg"}; // La dirección de archivo comprimido y el nombre del archivo se generarán // string desesperado = "d: //downloads//new.zip"; Archivo zipfile = nuevo archivo (filepath); ZipOutputStream zipstream = null; FileInputStream ZipSource = null; BufferedInputStream bufferStream = null; Pruebe {// Construya la secuencia de salida del paquete final comprimido ZipStream = neweutputStream (nuevo FileOutputStream (ZIPFile)); for (int i = 0; i <filenamearr.size (); i ++) {file file = new File (((String) FileMearr.get (i) .get ("f_filename")); // archivo archivo = nuevo archivo (PattyTyt [i]); // Formatear el archivo que debe comprimirse en la transmisión de entrada zipSource = new FileInputStream (archivo); // Las entradas comprimidas no son archivos independientes específicos, pero la lista de elementos en la lista de archivos de paquete comprimidos, llamados entradas, al igual que el índice // el nombre aquí es el nombre del archivo, y la duplicación del archivo hará que el archivo se sobrescriba. Aquí, el nombre del archivo más se usa para el reconocimiento de archivos únicos ZipEntry Zipentry = new Zipentry (i+file.getName ()); // Localizar la ubicación de la entrada comprimida y comenzar a escribir el archivo en el paquete comprimido zipstream.putNextEntry (ZipEntry); // ingresar bufferStream = new BufferedInputStream (ZipSource, 1024 * 10); int read = 0; // Crear byte búfer de lectura y escritura [] buf = nuevo byte [1024 * 10]; while ((read = buffertream.read (buf, 0, 1024 * 10))! = -1) {zipstream.write (buf, 0, read); }}} Catch (Exception e) {E.PrintStackTrace (); } Finalmente {// Cerrar la secuencia try {if (null! = buffertream) buffertream.close (); if (null! = zipstream) zipstream.close (); if (null! = ZipSource) ZipSource.close (); } catch (ioException e) {E.PrintStackTrace (); }} /*** Escriba el archivo de transmisión en el navegador frontal ServletOutputStream OS = Response.getOutputStream (); respuesta.setContentType ("Application/X-Octet-stream"); respuesta.setContentLength ((int) zipfile.length ()); Respuesta.AddHeader ("Disposición de contenido", "Adjunto; FileName =" + Urlencoder.Encode (fileZip, "UTF-8")); BufferedinputStream bis = null; BufferedOutputStream bos = null; intente {bis = new BufferedInputStream (new FileInputStream (FilePath)); bos = new BufferedOutputStream (OS); byte [] buff = new Byte [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; } Finalmente {if (bis! = Null) bis.close (); if (bos! = null) bos.close (); Archivo obj = nuevo archivo (filePath); if (obj.exists ()) {obj.delete (); // eliminar archivos comprimidos temporales generados localmente por el servidor}}*/// descargar el navegador // obtener información de proxy de la cadena final userAgent = request.getheader ("user-agent"); // juzga el proxy del navegador y establece el formato de codificación que responde al navegador respectivamente cadena finalFileName = null; if (stringUtils.contains (userAgent, "msie") || stringUtils.contains (userAgent, "trident")) {// es decir, el navegador finalFileName = urlencoder.enCode (fileZip, "UTF-8"); System.out.println ("es decir, navegador"); } else if (StringUtils.Contains (UserAgent, "Mozilla")) {// Google, Firefox Browser FinalFileName = Urlencoder.Encode (fileZip, "UTF-8"); } else {finalFileName = urlencoder.encode (fileZip, "UTF-8"); // Otros navegadores} Respuesta.SetContentType ("Application/X-Octet-Stream"); // Dígale al navegador que descargue el archivo en lugar de abrirlo directamente. El navegador predeterminado es abrir el respuesta. DataOutputStream temps = new DataOutputStream (servletOutputStream); DataInputStream in = new DataInputStream (new FileInputStream (FilePath))); // La ruta al archivo de descarga del navegador byte [] b = nuevo byte [2048]; Archivo reportzip = nuevo archivo (filePath); // Luego se usa para eliminar el archivo comprimido temporal, 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.getusernameNAME } finalmente {if (temps! = null) temps.close (); if (in! = null) in.close (); if (reportzip! = null) reportzip.delete (); // elimina el archivo comprimido temporal generado localmente por el servidor servletoutputstream.close (); } /***if (picinfollist.size ()> 0) {rc.put ("éxito", true); rc.put ("Picinfo", Picinfollist); optlogsvc.savelog (au.getUsername (), au.getattribute ("f_brno"), au.getattribute ("f_lstip"), toptlogservice.type_mr, ", au.getusernerNerNerNer.+" Descargar la lota de consulta "+parámetro (" f_svr_code "); } else {rc.put ("éxito", falso); rc.put ("Errmsg", "Información de prueba"); optlogsvc.savelog (au.getUsername (), au.getattribute ("f_brno"), au.getattribute ("f_lstip"), toptlogservice.type_mr, ", au.getusernerNerNerNer.+" Descargar la lote de consulta "+params.get (" f_svr_code ");"); ");"); ");"); ");"); ");"); ");"); ");"); ");"); }*/ optlogsvc.savelog (au.getusername (), au.getattribute ("f_brno"), au.getattribute ("f_lstip"), toptlogService.type_mr, "", au.getusEname ()+"imagen de descarga de la plataforma"+fileZip+"exitoso!"); devolver ; }Hay un problema con el formato de conversión de matriz JSON. Si el JSON enviado desde el front-end JSON está formateado por JSON.Stringify, debe analizarse de esta manera cuando va al fondo.
Mis habilidades de diseño no son buenas, así que echemos un vistazo. Juzgué que el navegador fue copiado en línea, pero descubrí que era inútil y no podía reconocer a los chinos. Al final, comprometí y todavía usé inglés como nombre del archivo. Si se encuentra con el código confuso chino, puede buscar nuevamente en Baidu. Otros han escrito artículos similares, pero no tengo la energía para estudiarlos.
Este es un método para comprimir archivos que existen en el servidor. También he visto artículos relacionados con Baidu antes para obtener imágenes de red y comprimirlas y descargarlas, lo cual es interesante.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.