ファイルのアップロードとダウンロードは、Web開発で発生する一般的な問題です。過去数日間で、プロジェクトでファイルのダウンロードが使用されています。また、以前に散らばった方法でいくつかのメモを取りました。今日はそれを整理します。ファイルのアップロードはさらにテストする必要があります。最初にファイルのダウンロードについて話しましょう。
1。ファイルのダウンロード処理プロセス
ファイルのダウンロードプロセスは実際には非常に明確です。つまり、次のとおりです。
1.ファイル名またはファイルパスに基づいてファイルを見つけます。特定の戦略は、主にあなた自身のニーズに基づいています。要するに、システムが見つけることができるファイルの完全なパスが必要です。
2。入力ストリームを取得し、ターゲットファイルから入力ストリームを取得します。
3.出力ストリームを取得し、応答から出力ストリームを取得します。
4.入力ストリームからファイルを読み取り、出力ストリームを介してファイルを出力します。これは、実際のダウンロード実行プロセスです。
5。IOストリームをオフにします。
これが主なプロセスであり、設定ファイルのより重要なコンテンツタイプタイプなど、必要な属性設定がいくつかあります。
2。もう話しないで、コードを追加します
私はSpringMVCでそれをしましたが、実際には、他のことにも同じことが言えます。主にhttpservletResponseオブジェクトと有効なターゲットファイルが必要です。
1。フロントデスクコード
/**アップロードされたファイルをダウンロード*/function downloadfromupload(filename){window.location.href = path + "/download?dir = upload&filename =" + encodeuri(encodeuri(filename));}/** normold download*/function download(filename){windocal.location.href = path + path + + "/download?dir = download&filename ="+encodeuri(encodeuri(filename));}2。コントローラーコード
/***ファイルのダウンロード(アップロードパスからのダウンロード)** @param request* @param Response* @throws ioexception*/ @responsebody @requestmapping(value = "/download")public void downloadfile(httpservletrequest request、httpservletresponse応答、ファイルモデルモデル) "utf-8");/**アップロードおよびダウンロードフォルダーのファイルのみを制限してダウンロードできます。 request.getSession()。getServletContext()。getRealPath( "/")+ "/web-inf/"+ foldername+ "/"+ filename; filetools.downloadfile(request、response、fileabsolutepath); log.warn( "userid:" "+(integer)(request.getSession(" username( "username)。 (request.getSession()。getAttribute( "username")) + "、ダウンロードファイル:" + fileabsolutepath);}
ここからのロジックのダウンロードは、フロントデスクがファイル名パラメーターを要求/ダウンロードして提供するだけであることです。中国語の文字化けコードを回避するために、前景ファイル名がパラメーターとして使用される場合、jsのencodeuri()を使用してUnicodeコードに変更し、その後中国語にデコードします。さらに、プロジェクトの特別な性質により、ここでダウンロードしたいファイルはアップロードおよびダウンロードフォルダーにある可能性があるため、ここには判断ロジックの一部があります。さらに、FileModelのファイル名と要求されたフォルダー名の両方をカプセル化します。
3。ロジックの実装をダウンロードします。
ここにはサービスはありませんが、静的メソッドを使用して直接実装されています。
/***ファイルをダウンロードするときにダウンロード名を指定*** @param request* httpservletrequest* @param Response* httpservletresponse* @param filepath* @param filename*クライアントのダウンロード時に表示されるファイル名を指定* string filepath、string filename)throws ioexception {bufferedinputStream bis = null; bufferedoutputStream bos = null; bis = new bufferedinputStream(filepath)); file(filepath).length(); respons.setcharacterencoding( "utf-8"); respons.setContentType( "multipart/form-data");/**各ブラウザーの中国の文字化けの問題を解決します*/string useragent = request.getheader( "user-agent"); filename.getBytes():filename.getBytes( "utf-8"); // filename.getBytes( "utf-8")safari filename = new String(bytes、 "ISO-8859-1")のスクランブルコードの問題を処理します。 //すべてのブラウザは基本的にISOエンコードResponse.setheader( "content-disposition"、string.format( "attachment; filename =/"%s/""、filename); resthedeader( "content-length"、string.valueof(filelength)); byte [] byte [] buft = bytedred; bis.read(fuff、0、buff.length))))))))))))) ioException*/public static void downloadfile(httpservletrequest request、httpservletresponse response、string filepath)throws ioexception {file file = new file(filepath); downloadfile(request、response、response、filepath、file.getname();}}クライアントがダウンロードしたファイル名を時々指定する必要性を解決するためのオーバーロードされたダウンロード方法を次に示します。
3。注意すべきこと
1。mimeタイプの選択について
以前はMIMEタイプについてあまり知りませんでしたが、インターネット上に異なる設定を持つ多くのダウンロードされたソースコードがあることがわかりました。それがこの文です
Response.setContentType( "MultiPart/form-data");
ここでMIMEタイプを設定する機能の1つは、クライアントブラウザにファイルを処理するように指示することを確認しました。特定の対応するWebサイトには多くの説明があります。このタイプのクラスIがこの形式で設定されている場合、通常、形式は自動的に一致します。
2.クライアントのダウンロードファイル名を指定します
クライアントがファイル、つまりこのコードをダウンロードしたときにファイル名を指定する必要がある場合があります
Response.setheader( "content-disposition"、string.format( "attachment; filename =/"%s/""、filename));
その中のファイル名はカスタマイズできます。前部を移動しないでください。
3。文字化けされた中国語の問題を解決します
中国のファイルが文字化けするにはあまりにも一般的です。プロジェクトシステムアーキテクチャが最初に構築される場合、エディター、ページ、データベースを含むすべての中国のエンコーディングを統合する必要があります。 UTF-8エンコーディングをお勧めします。 Springを使用している場合は、Springの文字セットフィルターを構成して、中国の文字化けコードをさらに回避することもできます。
(1)クライアントのファイル名のダウンロード要求プロセスが文字化けされています
時々私たちはそれに遭遇します。フロントデスクのページに中国のファイル名のダウンロードリストが表示されると、それは正常ですが、背景に行くと、リクエストのファイル名が文字化けされていることがわかります。現時点では、上記のecodeuriを使用して問題を解決できます。
(2)クライアントがダウンロードして実行すると、ファイル名が文字化けされました
実際のテストでは、他のブラウザが実行できる場合、IEの下の中国のファイル名が文字化けされる可能性があることがわかりました。私はそのようなコードをオンラインで見ました。テスト後、さまざまなブラウザーで文字化けされた中国の問題を完全に解決しました。
/**各ブラウザの中国の文字化けの問題を解決する*/string useragent = request.getheader( "user-agent"); bytes = useragent.contains( "msie")? filename.getBytes():filename.getBytes( "utf-8"); // filename.getBytes( "utf-8")safari filename = new String(bytes、 "ISO-8859-1")の文字化けの問題を処理します。 //すべてのブラウザは基本的にISOエンコードResponse.setheader( "content-disposition"、string.format( "attachment; filename =/"%s/""、filename))をサポートしています。
(3)サーバー上にターゲットされたファイル
さまざまなサーバーもプラットフォームによって異なる場合があるため、ここで注意する必要があります。特定のソリューションについては、私が以前に書いた記事を参照してください:ファイルのダウンロード中の中国の文字化け処理。
上記は、編集者によって紹介されたJava Web実装ファイルのダウンロードとGarled Processingメソッドです。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!