この記事の例は、参照用のJavaブレークポイントをダウンロードするためのコードを共有しています。特定のコンテンツは次のとおりです
1。Javaコード
//ファイルdownloadfile(){file dir = new file(filepath); //ファイルパスを取得するif(!dir.exists()){system.out.println( "ファイルパスエラー"); log.debug( "ファイルパスエラー"); 「失敗」; //ファイルまたはフォルダーが存在するかどうか}ファイルdownloadfile = new file(dir、filename); //ファイルを探しますif(!dir.isfile())){system.out.println( "ファイルは存在しません"); log.debug( "ファイルは存在しません"); 「failed」を返します; } catch(clientAbortexception e){system.out.println( "接続終了"); log.debug( "接続終了"); } catch(ioexception e){e.printstacktrace(); } nullを返します。 } private void downloadFileRanges(ファイルdownloadFile)throws ioException {//ファイルサイズをダウンロードするlong filelength = downloadfile.length(); //ファイルサイズはダウンロードされましたlong pastlength = 0; // Express Trainをダウンロードするかどうか。 //ダウンロードする必要があるエンドバイトの数を記録するために使用されます(Thunderまたはその他のダウンロード)Long Lenend = 0; // string rangebytes = request.getheader( "range")をダウンロードするためにクライアントが必要とするデータ範囲の文字列を記録するために使用されます。 //ファイルをランダムに読み書きするために使用されていますrandomAccessfile raf = null; outputStream os = null; outputStream output = null;バイトb [] = new byte [1024]; //クライアントのダウンロード要求に範囲が含まれている場合if(null!= rangebytes){// return code 206 response.setstatus(httpservletresponse.sc_partial_content); rangebytes = request.getheader( "range")。fallingeall( "bytes ="、 ""); // range range string mode if(rangebytes.indexof( ' - ')== rangebytes.length() - 1){// endバイト数はありません、fast isflashget = true; rangebytes = rangebytes.substring(0、rangebytes.indexof( ' - ')); PastLength = long.Parselong(rangebytes.trim()); } else {//サンダーダウンロードisflashget = false; string startbytes = rangebytes.substring(0、rangebytes.indexof( ' - ')); string endbytes = rangebytes.substring(rangebytes.indexof( ' - ') + 1、rangebytes.length()); //ダウンロードされたファイルセグメントpastlength = long.parselong(startbytes.trim()); //ダウンロードする必要があるファイルバイトの数(ダウンロードされたファイルセグメントから開始)lenend = long.parselong(endbytes); }} //クライアントにブレークポイントを継続的に送信できるように通知します。応答形式は次のとおりです。 // Response.reset(); //最初のダウンロードの場合、ステータスはデフォルトで200、応答形式は次のとおりです。http/1.1 200 ok if(0!= pastlength){//コンテンツ範囲文字列contentrange = ""; //コンテンツフォーマット// content-range:bytes [ファイルブロックの開始バイト] - [ファイル1の合計サイズ] || [ファイルの合計サイズ] if(isflashget){contentrange = new Stringbuffer( "bytes").append(new long(pastlength).tostring())。 .Append( "/")。append(new long(filelength).tostring()).toString(); } else {contentrange = new StringBuffer(rangebytes).append( "/").append(new long(filelength).tostring())。toString(); } response.setheader( "content-range"、contentrange); }文字列filename = getDownLoadChineseFileName(filename); Response.setheader( "content-disposition"、 "attachment; filename =" + filename + ""); //応答の形式は次のとおりです。応答.setContentType( "Application/Octet-Stream"); Response.Addheader( "Content-Length"、String.ValueOf(filelength)); try {os = response.getOutputStream(); output = new BufferedOutputStream(OS); raf = new RandomAccessFile(downloadfile、 "r"); //ダウンロードされたバイト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など(raf.getfilepointer()<lenend){output.write(raf.read()); }} output.flush(); } catch(ioException e){ /***データを書き込むとき、クライアントAbortexception*などの例外はダウンロードをキャンセルし、サーバーが引き続きブラウザにデータを書き留めます。これは正常です。特にThunderのような血を流すクライアントソフトウェアの場合。 *明らかに、バイトを読むスレッド= 1275856879-1275877358があります。 *読み取りが短期間で完了していない場合、サンダーは再び2番目と3番目のものを開始します。 。 。スレッドは、1つのスレッドが読み取りが終了するまで、同じバイトセグメントを読み取ります。 Thunderは、同じバイトセグメントをダウンロードしている他のスレッドを殺し、バイトの読み取りを強制的に中止し、サーバーがClientAbortexceptionをスローします。 *したがって、この例外を無視します*/}最後に{if(output!= null){output.close(); } if(raf!= null){raf.close(); }}} private string getdownloadchinesefileName(string paramname){string downloadChineseFileName = ""; try {downloadChineseFileName = new String(paramname.getBytes( "gbk")、 "ISO8859-1"); } catch(unsupportedencodingexception e){e.printstacktrace(); } downlow 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。STRUTSセクション<BR />コードを次のようにコピーします。
<result name = "failed" type = "redirectaction"> showdownloadfilenameList </result>
</action>
3。JSPパーツ
コードコピーは次のとおりです。<td> <a href = "downloadfile?filename = $ {filemap.key} && filepath = $ {filemap.value}"> file download </a> </td>> </td>