Este artigo compartilha o código específico para os arquivos de download em lote Java Background e comprimindo -os em downloads postais para sua referência. O conteúdo específico é o seguinte
Devido às necessidades do projeto, os arquivos de imagem no servidor são compactados e embalados e baixados na área de trabalho local.
Primeiro, JS front-end:
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 ('dica', "digite o código da consulta de transação"); retornar; } else {$ .ajax ({type: "post", url: 'quererypic.translog.action', dados: {f_brno: picinst, f_sdate: picsdate, f_edate: picdate, f_svr_code: svrcode, f_Edime: scort: if (rcdata.success) {var lobs = rcdata.picinfo; Todos </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'> existe alguma imagem </th> <th style = 'width: 23%; 10%; Texto-alinhamento: Centro '> Status de negociação </th> <th style =' width: 12%; text-align: Centro '> número do dispositivo </th> <th style =' width: 10%; text-align: Centro '> Código de Trading </th> <the <the style =' width: 10%; text-align: Centro '> Afilied Institution </th> hora </th> </tr> </sead> <tbody> "; para (var i = 0; i <robes.length; i ++) {detalhehtml = detalhehtml +" <tr> <td align = 'center'> <input type = 'caixa de seleção' name '' iMtage '=' '" + ROWs]. /> </td> <td> " + linhas [i] .f_date +" </td> <td> " + linhas [i] .ishasimg +" </td> <td> " + linhas [i] .f_tx_name +" </td> <td> " + fileiras [i]. linhas [i] .f_dev_id + "</td> <td>" + linhas [i] .f_svr_code + "</td> <td>" + linhas [i] .f_svr_code + "</td> <td>" + linhas [i]. "</td> </tr>"; }); }}}O código acima é exibido na interface depois de consultar os dados relevantes e, de acordo com as necessidades do cliente, você pode escolher quais dados para baixar e salvar.
Anexe a caixa de seleção Selecione tudo/Cancelar Selecione todo o código JS
// Caixa de seleção Selecione tudo/Cancelar Selecione todos var ischeckall = false; function swapcheck () {if (ischeckall) {$ ("input [type = 'caixa de seleção']"). cada (function () {this.checked = false;}); ischeckall = false; } else {$ ("input [type = 'Caixa de seleção']"). cada (function () {this.checked = true;}); ischeckall = true; }} O código a seguir é usado para interação em segundo plano. Lembre -me de que, se você baixar arquivos, não use o AJAX para enviar dados. Eu fiz isso antes e não consegui baixá -lo. Eu só descobri depois de um dia inteiro. A parte do comentário é o código AJAX. Você pode dar uma olhada nele como uma referência:
função Downloadpic () {var arr = new Array (); var picids = document.getElementsByName ("PictureId"); para (i = 0; i <picids.length; i ++) {if (picids [i] .Checked) {arr.push (picids [i] .Value); }} if (arr.length <= 0) {$ .messager.alert ('t prompt', "sem conteúdo de download!"); retornar; } else {$ ('#formpic'). att ('ação', 'Downloadpic.Translog.action'); $ ("#formpic"). form ('submeter', {onSubMit: function () {}, sucesso: function (data) {$ .messager.alert ('dica', 'imagem download de imagem', 'info');}}); /***$. Ajax ({type: "post", url: 'Downloadpic.Translog.action', Data: {PictureList: json.stringify (arr)}, success: function (rcdata) {if (rcdata.sucess) {$ .messager.show ({{{{title: 'succremem' ',' rdata) {if (rcdata.sucess) {$ .messager.show ({{{{title: 'succremem' ',' rdata) {if (rcdata.sucess) {$ .messager.show ({{{{title: 'succomer; } else {$ .messager.alert ('dica', rcdata.errmsg); */}} O próximo é a interação em segundo plano, antes de tudo, a camada de controle do controlador:
/** * Download do lote de imagem * @param request * @param Resposta * @return * @throws ioexception */public void Downloadpic (solicitação httpServletRequest, httpServletResponse resposta) lança ioexception {// map <string, object> parames = getParameters (request); String [] PictureIds = request.getParameTervAlas ("PictureId"); Autenticação au = getAuthentication (request); Service.Downloadpic (PictureIds, AU, solicitação, resposta); retornar ; } Camada de serviço:
public void Downloadpic (String [] Params, Autentication Au, HttpServletRequest Solicy, HttpServletResponse Response) lança IoException {// Configuração inicial do arquivo compactado String Path = System.getProperty ("ICS.WebApp.root"); String filezip = Au.getUserName ()+"-"+au.getAttribute ("f_brno")+"pictures.zip"; String filepath = caminho + "//" + filezip; // é usado para gerar um arquivo zip // filepatharr é o conjunto de caminhos de arquivo PDF obtidos através da consulta do banco de dados com base nas informações transmitidas do primeiro plano (especificamente para o sufixo) list <pp, objeto >> fileNamearr = novo; // jsonArray jSons = jsonArray.FromObject (params.get ("pictureList")); /***List <String> PictureIds = new ArrayList <String> (); for (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, objeto >> reclists = dao.queryloginfo (speMap); for (int j = 0; j <reccists.size (); j ++) {filenamearr.add (Recists.get (j)); }} // O arquivo que precisa ser compactado e incluir o endereço do arquivo e o nome do arquivo // string [] pattytytyt = {"d: //13.jpg", "d: //1212.jpg"}; // O endereço do arquivo compactado e o nome do arquivo a serem gerados // string despath = "d: //downloads//new.zip"; Arquivo zipfile = novo arquivo (filepath); ZipOutputStream zipStream = null; FileInputStream zipsource = null; BufferInputStream bufferStream = null; tente {// Construa o fluxo de saída do pacote compactado final zipStream = new ZipOutputStream (new FileOutputStream (zipfile)); for (int i = 0; i <filenamearr.size (); i ++) {arquivo file = new File ((String) filenamearr.get (i) .get ("f_filename")); // arquivo de arquivo = novo arquivo (pathtytyt [i]); // formate o arquivo que precisa ser compactado no fluxo de entrada zipsource = new FileInputStream (FILE); // Entradas compactadas não são arquivos independentes específicos, mas liste itens na lista de arquivos de pacote compactados, chamados entradas, assim como o índice // O nome aqui é o nome do arquivo, e a duplicação do arquivo fará com que o arquivo seja substituído. Aqui, eu mais o nome do arquivo é usado para zipentry de reconhecimento de arquivo único zipentry = new Zipentry (i+file.getName ()); // Localize a localização da entrada compactada e comece a escrever o arquivo no pacote compactado zipStream.putNextEntry (Zipentry); // BufferStream de entrada = new BufferInputStream (ZIPSOURCE, 1024 * 10); int read = 0; // Crie buffer de leitura e gravação byte [] buf = novo byte [1024 * 10]; while ((read = bufferStream.read (BUF, 0, 1024 * 10))! = -1) {zipStream.Write (buf, 0, leia); }}} catch (Exceção e) {e.printStackTrace (); } finalmente {// feche o fluxo tente {if (null! = bufferStream) bufferStream.close (); if (null! = zipStream) zipStream.close (); if (null! = zipsource) zipsource.close (); } catch (ioexception e) {e.printStackTrace (); }} /*** Escreva o arquivo de fluxo no navegador front-end servletOutputStream OS = Response.getOutputStream (); Response.setContentType ("Application/X-OCTET-Stream"); Response.setContentLength ((int) zipFile.Length ()); Response.AddHeader ("Content-Disposition", "Applement; filename =" + urlencoder.encode (FILEZIP, "UTF-8")); BufferInputStream bis = null; BufferOutputStream bos = nulo; tente {bis = new bufferInputStream (new FileInputStream (filepath)); bos = new bufferoudOutputStream (OS); byte [] buff = novo 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) {tiro e; } Finalmente {if (bis! = Null) bis.close (); if (bos! = null) bos.close (); Arquivo obj = novo arquivo (filepath); if (obj.exists ()) {obj.delete (); // excluir arquivos compactados temporários gerados localmente pelo servidor}}*/// download do navegador // Obtenha informações proxy do navegador final string userAgent = request.getheader ("user-agente"); // julga o proxy do navegador e defina o formato de codificação que responde ao navegador, respectivamente, string finalfilename = null; if (stringutils.contains (userAgent, "msie") || stringutils.contains (userAgent, "trident")) {// ie navegador finalfilename = urlencoder.encode (filezip, "utf-8"); System.out.println ("ou seja, navegador"); } else if (stringutils.contains (userAgent, "mozilla")) {// google, navegador de firefox finalfilename = urlencoder.encode (filezip, "utf-8"); } else {finalfilename = urlencoder.encode (filezip, "utf-8"); // outros navegadores} Response.setContentType ("Application/x-octet-stream"); // diga ao navegador para baixar o arquivo em vez de abri-lo diretamente. O navegador padrão abre a resposta.setheader ("Content-Disposition", "Applement; filename =" +FinalFileName); // o nome do arquivo de download servletputStream servletoutStream = Response.getoutStream (); DataOutputStream Temps = new DataOutputStream (ServletOutputStream); DatainputStream in = new DataAinputStream (new FileInputStream (filepath)); // O caminho para o navegador Download File Byte [] B = novo byte [2048]; Arquivo Relatóriozip = novo arquivo (filepath); // é usado para excluir o arquivo compactado temporário, tente {while (in.Read (b))! = -1) {temps.write (b); } temps.flush (); } catch (Exceção e) {e.printStackTrace (); optlogsvc.savelog (Au.getUserName (), Au.getAttribute ("f_brno"), Au.getAttribute ("f_lstip"), toptlogService.type_mr, "," Au.getUserName ()+"Batch Picture" +zip } finalmente {if (temps! = null) temps.close (); if (in! = null) in.close (); if (reportzip! = null) reportzip.delete (); // exclua o arquivo compactado temporário gerado localmente pelo servidor servletOutputStream.close (); } /***if (picinfollist.size ()> 0) {rc.put ("sucessor", true); rc.put ("picinfo", picinfollist); optlogsvc.savelog (au.getUserName (), Au.getAttribute ("f_brno"), Au.getAttribute ("f_lstip"), toptLogService.type_mr, "", au.getUserName ()+"defesa download" } else {rc.put ("sucessor", false); rc.put ("errmsg", "Informações de teste"); optlogsvc.savelog (au.getUserName (), Au.getAttribute ("f_brno"), au.getAttribute ("f_lstip"), toptLogService.type_mr, "", au.getUserName ()+"batch download" }*/ optlogsvc.savelog (Au.getUserName (), Au.getAttribute ("f_brno"), Au.getAttribute ("f_lstip"), toptLogService.type_mr, "" Au.getUsername ()+"Brawen Picture" retornar ; }Há um problema com o formato de conversão da matriz JSON. Se o JSON enviado do JSON front-end for formatado por JSON.Stringify, ele deve ser analisado dessa maneira quando você for ao fundo.
Minhas habilidades de layout não são boas, então vamos dar uma olhada. Julguei que o navegador foi copiado on -line, mas achei que era inútil e não conseguia reconhecer o chinês. No final, comprometi -me e ainda usei o inglês como o nome do arquivo. Se você encontrar código chinês ilegal, poderá pesquisar novamente no Baidu. Outros escreveram artigos semelhantes, mas não tenho energia para estudá -los.
Este é um método de compactar arquivos existentes no servidor. Eu também vi artigos relacionados ao Baidu antes de obter fotos de rede e comprimir e baixá -las, o que é interessante.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.