Os exemplos deste artigo compartilham o código para baixar pontos de interrupção java para sua referência. O conteúdo específico é o seguinte
1. Código Java
// Implementar arquivo downloadfile () {File dir = new File (filepath); // Obtenha o caminho do arquivo se (! Dir.exists ()) {System.out.println ("Erro do caminho do arquivo"); log.debug ("Erro do caminho do arquivo"); retornar "falhou"; // direção se existe um arquivo ou pasta} file downloadfile = new File (dir, nome do arquivo); // Procure o arquivo se (! Dir.isfile ())) {System.out.println ("o arquivo não existe"); log.debug ("o arquivo não existe"); retornar "falha"; // determinar se o arquivo ou pasta existe} tente {DownloadFileRanges (downloadfile); } catch (clientaborTexception e) {System.out.println ("conexão terminada"); log.debug ("conexão terminada"); } catch (ioexception e) {e.printStackTrace (); } retornar nulo; } private void DownloadFileRanges (File DownloadFile) lança IoException {// Tamanho do arquivo a ser baixado long fileLength = DownloadFileFile.length (); // Tamanho do arquivo baixado do passado longo do comprimento = 0; // Se deve baixar o trem expresso, caso contrário, é trovão ou outro booleano isflashget = true; // usado para gravar o número de bytes finais que precisam ser baixados (Thunder ou outros downloads) Long lenend = 0; // usado para gravar a string de intervalo de dados exigida pelo cliente para baixar string rangeBytes = request.getheader ("range"); // usado para ler e gravar arquivos aleatoriamente RAFACcessFile RAF = NULL; OutputStream OS = NULL; OutputStream Output = NULL; byte b [] = novo byte [1024]; // se a solicitação de download do cliente contiver o intervalo se (null! = RangeBytes) {// Código de retorno 206 Response.setStatus (httpServletResponse.sc_partial_content); rangeBytes = request.getheader ("range"). replaceall ("bytes =", ""); // Juiz Range String Mode if (rangeBytes.IndexOf (' -') == rangeBytes.length () - 1) {// não há número de byte final, fast 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 ()); // segmento de arquivo baixado PASTLENGLE = LONG.PARSELONG (StartBytes.Trim ()); // o número de bytes de arquivo que precisam ser baixados (inicie no segmento de arquivo baixado) lenend = long.parselong (endbytes); }} // Notificar o cliente para permitir que pontos de interrupção sejam transmitidos continuamente, o formato de resposta é: Aceptons: Bytes Response.setheader ("Aceitar-Ranges", "Bytes"); // Response.Reset (); // Se for o primeiro download, o status padrão de 200 e o formato de resposta é: http/1.1 200 ok se (0! = Comprimento passado) {// Range de conteúdo String String contentRange = ""; // Formato de resposta // Range de conteúdo: bytes [Iniciar byte do bloco de arquivos]-[Tamanho total do arquivo-1] || [Tamanho total do arquivo] if (isflashget) {contentRange = new StringBuffer ("bytes") .Append (New Long (PastLength) .ToString ()). .APNEND ("/"). Anexe (novo longo (comprimento do filtro) .ToString ()) .ToString (); } else {contentRange = new StringBuffer (rangeBytes) .append ("/") .append (novo longo (comprimento do filtro) .toString ()). ToString (); } Response.setheader ("Range de Conteúdo", ContentRange); } String filename = getDownLoadchineseFileName (nome do arquivo); Response.setheader ("Content-Disposition", "Applement; FileName =" + FileName + ""); // O formato da resposta é: Response.setContentType ("Application/Octet-Stream"); Response.AddHeader ("Length-comprimento", String.ValueOf (FILELENGLE)); tente {OS = Response.getOutputStream (); output = new BufferedOutputStream (OS); RAF = novo RandomAccessFile (downloadfile, "R"); // Skip Bytes Bytes Raf.seek (Pastlength); if (isflashget) {// express etc int n = 0; while ((n = raf.read (b, 0, 1024))! = -1) {output.write (b, 0, n); }} else {// thunder etc while (raf.getFilePointer () <lenend) {output.write (raf.read ()); }} output.flush (); } Catch (ioexception e) { /*** Ao escrever dados, exceções como ClientAborTexception* são lançadas porque o cliente cancela o download e o servidor continua a escrever dados no navegador. Isso é normal. Especialmente para software cliente que suporta sangue como Thunder. * Obviamente, há um thread lendo bytes = 1275856879-1275877358. * Se a leitura não for concluída em um curto período de tempo, o Thunder iniciará o segundo e o terceiro novamente. . . O tópico diz o mesmo segmento de bytes até que um thread termine de ler. Thunder matará outros threads que estão baixando o mesmo segmento de bytes, abortam à força a leitura de bytes, fazendo com que o servidor jogue o ClientAborTexception. * Então, ignoramos esta exceção*/} finalmente {if (output! = Null) {output.close (); } if (raf! = null) {raf.close (); }}} private String getDownLoadLeeseFileName (String paramName) {String DownloadchineseFileName = ""; tente {downloadchinesefileName = new String (paramname.getbytes ("gbk"), "iso8859-1"); } Catch (UnsupportEdEncodingException e) {E.PrintStackTrace (); } return DownloadChineseFileName; } public string getFilePath () {return filepath; } public void setFilePath (string filepath) {this.FilePath = filepath; } public string getFilename () {return filename; } public void setFilename (string filename) {this.filename = filename; } public httpServletRequest getRequest () {return request; } public httpServletResponse getResponse () {return Response; } 2. Seção Struts <r /> Copie o código da seguinte
<resultado name = "falhou" type = "redirectaction"> shõesDownloadFilenamelist </sireld>
</ction>
3. JSP Part
A cópia do código é a seguinte: <td> <a href = "DownloadFile? FileName = $ {Filemap.key} && filepath = $ {filemap.value}"> Download do arquivo </a> </td>