まず、関連するテクノロジーを紹介させてください。
サービス方法の2つの重要なパラメーター。
ServletRequestはそれを使用してユーザーリクエストを受信し、その機能は次のとおりです。
サブインターフェイスの1つ:javax.servlet.http.httpservletrequest
ServleTResponseは、ユーザーにデータを返すために使用されます。
サブインターフェイスの1つ:javax.servlet.http.httpservletResponse
ファイルダウンロードテクノロジー:
ファイルのダウンロードテクノロジーは、アップロードテクノロジーを比較的簡単です。例として写真をダウンロードしましょう:
最初に写真を閲覧してからダウンロードします
1。フロントエンドコード:
<span style = "font-size:14px;"> <a href = "img">フォルダーの下にすべての写真を見つけます</a> <br/> </span>
フロントデスクは、たった1つの文で実行できます。 web.xmlを介してバックグラウンドプログラムを直接検索します
2。背景表示コード:
<Span style = "font-size:14px;"> public class showimgはhttpservlet {public void doget(httpservletrequest request、httpservletresponse応答)t servletexception、ioexception {<span style = "white-space:pre"> </span> dopost(request、response); //例外を防ぐには、dogetとdopostを一緒に接続します} </span> <span style = "font-size:14px;"> public void dopost(httpservletrequest request、htt pservletresponse応答)Servletexception、 ioException {request.setcharacterencoding( "utf-8"); "> <Span style =" font-size:14px; "> // <span style =" white-space:pre "> </span>もちろん、直接呼び出すこともできます----写真が使用されるときにファイルへの絶対パスが必要です</span> servletcontext context = getservletcontext(); string path = context.getRealPath( "/imgs"); "> // <Span style =" White-Space:pre "> </span>フォルダーを見つけた後、ユーザーのすべての画像を文字列files [] = file.list(); for(string fn:files) {</span> <pre name = "code"> <span style = "font-size:14px;"> //すべてを表示</span>文字列img = "<img src = 'imgs/"+fn+"'/>";
// out.print( "<a href = imgs/'"+fn+"'> picture </a>"); string str = "<a href = 'ダウン?name = imgs/"+fn+"'>画像をダウンロード</a> "; //ダウンロードハイパーリンクを提供し、パラメーターを渡します---ファイル名をユーザーリンクコンテンツに転送し、write.print(str); out.print(img+" <br/> ");}}
3。ファイルの具体的なダウンロード
まず、対応するプロトコルを設定する必要があります。ダウンロードプロトコルでは、対応するダウンロードヘッダーを設定する必要があります
<span style = "white-space:pre"> </span> <span style = "font-size:18px;"> <strong> response.setContentType( "Application/Force-Download" </strong>);//// /対応するヘッダーを設定</span>
ダウンロードするときは、現在の画像のファイル名を表示する必要があります。
<span style = "font-size:18px;"> <span style = "white-space:pre"> </span> outputstream out = response.getOutputStream(); //出力ストリーム文字列名= reque stを取得します。 getParameter( "name"); 「utf- 8」); //中国語をcodedにする必要がある場合、System.out.println(aa);強い>添付ファイル</strong> </span> = '"+aa+"' "); //そこから送信されて、</span>
特定のダウンロードを作成します
<span style = "font-size:18px;"> string filename = this.getServletContext()。getRealPath(name); //絶対パスを取得し、ファイル名を渡し、同時に、絶対パスを渡すと同時に入力を読むことができます= new FileInputStream(Filename)。 {out.write(b、0、len);複製画像:
クリック後のレンダリング:
ファイル名は異なります
ファイルアップロードテクノロジー
ファイルを自分でアップロードするのは非常に面倒なので、他の人のパッケージを使用してリンクをダウンロードしてクリックしてリンクフォームを開きます。
クライアントは、HTTPを送信するときに複合データ型を表すために、MultiPart/Form-Dataデータ型を使用する必要があります。
つまり、<form enctype = "multipart/form-data">
<input type = "file" name = "somename"/> htmlタグをフォームで使用します。
必要なパッケージ:
commons-fileupload.jar、コアファイルアップロードツールはこのパッケージにあります。
ファイルをアップロードするために必要なCommons-Io.jarパッケージ
詳細な説明:
DiskFileItemFactory-キャッシュ領域サイズを指すタイムモニタリングファイルディレクトリを作成します
servletfileuploadは、httpservletrequestを解析するために使用されます。ファイルオブジェクトのセットを返します。
FileItemは、ユーザーによってアップロードされた各ファイルオブジェクトを表します。
主なプロセス:
ファイルf = newファイル( "f:/ex/temp"); //一時ファイルストレージの場所を指定します
DiskFileItemFactory FF = new DiskFileItemFactory(1024*1024*5、f); //一時ファイルのサイズとストレージの場所
servletfileupload sf = new servletfileupload(ff);
List <FileItem> list = sf.parserequest(request); // parsingを開始します
for(fileitem it:list){//ファイル名を取得します。 UUIDを使用して、名前を複製する問題を解決します
fileutils.copyinputStreamTofile(it.getInputStream()、new file(path+"/"+filename)); //指定されたフォルダーの作成
}
1。フロントデスクコード:
<span style = "font-size:18px;"> <h2> upload file </h2> <form action = "upfile" method = "post" <span style = "color:#ff0000;"> enctype = "multipart /form-data "</span>> //記述する必要があります。そうしないと、ステーションはデータを受信できません<! - this enctype =" multipart/form-data "---> file1 <入力タイプ="ファイル "<< span style = "color:#ff6666;"> name </span> = "file"/> <br/>名前を入力してください:<input type = "text" <span style = "color:#ff6666;"> name </span> = "desc"/> <br/> file2 <input type = "file" <span style = "color:#ff6666;"> name </span> = "file"/> <br/>名前を入力してください:<入力タイプ= "テキスト" <span style = "color:#ff0000;"> name </span> = "desc"/> <br/> <入力タイプ= "value =" submit "/> </form> </span>
2。背景コード:
2-1一時的なファイルを保存するためのハードディスクベースの工場を最初に作成します
//一時的なストレージの場所を指定しますファイルf = newファイル( "f:/ex/temp");一時的なファイルとストレージの場所
2-2サーブレットファイルプロードオブジェクトを作成し、ファイルサイズを設定してファイル転送を最大化する
// ServletFileupload Sf = new ServletFileupload(FF)の解析のオブジェクトを作成します。 *20);すべてのファイルの最大値は、string path = getRealPath( "/imgs");
2-3オブジェクトの解析を開始します
<span style = "white-space:pre"> </span> list <fileitem> list = sf.parserequest(request); //フロントデスクから送信されたすべての情報を取得するには、フロントデスクがenctype = "multipartを入力する必要があります/form-data "for(fileitem it:list){it0 = it; // <span style =" white speace:pre "> </span>それが通常のフォームオブジェクトである場合 - あなたは直接判断できます( it.isformfield()){// type = text name value string name = it.getString( "utf-8")などの通常のフォーム項目です。 +name); //説明書の名前の下} else} else {<span style = "white-space:pre"> </span> // (); //特定のファイルパス - -Absolute Path // string str = it.getString(); // system.out.println( "str"+str); .getContentType(); <pre name = "code" style = "font- size:18px;"> // <span style = "pre"> </span>サーバー側のリソースファイル名は中国語ではできません、ブラウザは自動的にエンコードします-------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -----------アップロードされたファイル名は、中国語のストレージなしで名前に変換されます。マッピング名は保存し、ユーザーがダウンロードされるときに変換する必要があります。 //マップ名文字列ID = uuid.randomuuid()。toString()。置換( " - "、 ""); lastIndexof( "。")対応する場所に書き込みますfileutils.copyinputStreamTofile(it.getInputStream()、new file(path+"/"+filename)); //パスはストレージの絶対パスです - 定義された前のパス}}}
これは簡単なアップロードを実現できますが、この種のアップロードはまったく安全ではありません。完全なコードには、一般的な問題を防ぐための小さな問題が添付されています。
ファイルを選択した後
WebサーバーIMGのファイルを確認すると、ファイルは「UUIDによって生成されたファイル名」というページにアップロードされています。
ファイルアップロードソースコード:
<Span Style = "font-size;"> package cncu.upfile; Import java.io.io.io.io.io.io. java.util.uuid.servlet.http.httpsert.http.https; .apache .fileupload.fileitem.commons.fileuploadection; apache.commons .io.fileutils; public class myupfileはhttpservlet {<span style = "white-space:pre;"> </span> //ユーザー列に住所を入力するのを防ぎます。 no no nocess <span style = "white-space:pre;"> </span> @override <span style = "white;"> </span>プロテクションボイドdoget(httpservletrequest req、http servletresponse rep)< Span style = "white-space:pre;"> </span> Servletexception、ioException {<span style = "white-space:pre;"> </span> setcontenttype( "utf-8"); SPAN STYLE = "White-Space:pre;"> </span> wr = resp.getWriter();サポートされているまだアップロード方法 "); <span style =" white-space:pre; "> </span>} <span style =" white-space:pre; "> </span> <span style ="ホワイトスペース:pre; "> </span> public void dopost(httpservletrequest request、httpservletresponse応答)<span style =" white-space:pre; "> </span> throws servletexception {<span style ="ホワイトスペース: " pRE; "); <span style =" white-space:pre; "> </span> printwriter out = respons.getWriter(); <span style =" white-space:pre; "> </span> //通常のフォームアップロード方法1:<SPAN STYLE = "White-Stace:pre;"> </span> // return Value get(null)post1(apllication/x-form-urlencoded、normal form)post2(file:multipart/フォームデータ、ファイルアップロードフォーム)// <SPAN STYLE = "White-Space:"> </span> request.getContentType(); > </span> if(type.contains("mulitpart/form-data "))){// <span style =" white-space:pre; "> </span> out.write("アップロードをサポートしないでください通常のフォーム2 "); // <span style =" white-space:pre; "> </span> return; // <span style =" white-space:pre; "> </span>} <span style = "white-space:pre;"> </span> //方法2 <span style = "pre;"> </span> boolean boo = servletfileupload.ismultipartcontent(request); "ホワイトスペース:pre;"> </span> if(boo == false){<span style = "white-space:pre;"> </span> out.print( "supload 1の通常のフォームはありませんsupported "); <span style =" white-space:pre; "> </span> <span style =" white-space:pre; "> </span>} <span style =" white-space:pre; "> </span>} span> <span style =" white-space:pre; "> </span> //一時的なストレージの場所を指定<スパンスタイル=" white; "> </span>ファイルf = new file( "f:/ex/temp"); //一時ファイルストレージの場所を指定します5、f); //一時的なファイルサイズとストレージの場所<スパンスタイル= "ホワイトスペース:pre;"> </span> <span style = "white-space:pre;"> </span> // create解析のためのオブジェクト<span style = "white-space:"> </span> servletfileupload sf = new servletfileupload(ff); (1024*1024*10); //単一のストレージ場所のみの最大値は10m <Span style = "white;"> </span> sf.setsizemax(1024*1024*20);//// /すべてのファイルの最大値は20m <span style = "white-space:"> </span> string path = this.getServletContext()。getRealPath( "/imgs");スペース:pre; "> </span> system.out.println("ストレージパス: "+パス); <span style =" white-space:pre; "> </span> // parsing <span style = 「ホワイトスペース:pre;」> </span> fileitem it0 = null; 「ホワイトスペース:pre; "> </span> list <fileitem> list = sf.parserequest(request); //フロントデスクから送信されるすべての情報を取得するには、フロントデスクがenctype =" multipart/form-を入力する必要があります。 data "<span style =" white- space:pre; "> </span> for(fileitem it:list){<span style =" white-space:pre; "> </span> it0 = it; <span style = "white-space:pre;"> </span> if(it.isformfield()){//は、type = text of name <span style = "white-space:preなどの通常のフォーム項目です。 ; "> </span> string name = it.getString(" utf-8 "); <span style =" pre; "> </span> system.out.println("基本形式項目名: "+name); //説明の名前の下に書かれている<span style =" white-space:pre; "> </span>} else {<span style =" white-space:pre; "> </ span> string name = it.getname();//spilef file path // <span style = "white-space:pre;"> </span> string n1 = it.getFieldName(); 「ホワイトスペース:pre; "> </span> string str = it.getString(); //ファイル内のコンテンツ// <span style =" white-space:pre; "> </span> system。 out.println( "str"+str); -space:pre; "> </span> string contentType = it.getContentType(); <span style =" white-space:pre; "> </span> long size = it.getSize(); <span style = 「ホワイトスペース:pre; "> </span> //ファイルが空から<span style =" pre; "> </span> if(size == 0){<span style ="ホワイトスペース:pre; "> </span>継続; //ファイルは空です。 :pre; "> </span> //ユーザー名。 <span style = "white-space:pre;"> </span> if(name == null || name.trim()== ""){<span style = "white-space:pre ; "> </span> <span style =" pre; "> </span>} <span style =" white-space; "> </span> // <span style = 「ホワイトスペース:pre; "> </span> out.println(name+"、 "+contentType+"、 "+size); /サーバー側のリソースファイル名は中国語ではありません、ブラウザは自動的にエンコードします----------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- -------------------------------------------------------------- ------> </span> //ユーザーがダウンロード時に元の名前を復元できるようにするには、元のファイル名とマッピング名の間に通信を保存し、ユーザーがダウンロードされたときにそれを変換する必要があります。 pre; "> </span> //マッピング名<span style =" white-space:pre; "> </span> string id = uuid.randomuuid()。toString()。置換(" - "、"、 " ); <span style = "pre;"> </span> // file name <span style = "> </span> lastname = name.substring(name.lastindexof ( "。")); </span> string filename = id+lastName;対応する場所に書き込みます<span style = "white-space:pre;"> </span> fileutils.copyinputStreamTofile(it.getInputStream()、new file(path+"/"+filename));} <Span Style = "ホワイトスペース:pre;"> </span>}} catch(fileuploadexception e){<span style = "white-space:pre;"> </span> throw new runtimeexception( "ファイルアップロード解析エラー。" + e); <span style = "pre;"> </span>}最後に{<span style = "> </span> span style = "white-space:pre;"> </span> it0.delete(); //一時ファイルを削除<span style = "white-space:pre;"> </span>}} out.close( );}} </span> <span style = "font-size:18px;"> </span>ファイルダウンロードソースコード:[html] view plainCopyPrint? CN servletexception.servlet.httpert.http.httpservletrequest.http.httpservetre応答応答)スローservletexcepti on、ioexception {dopost(request、response);ユーザー名をフロントデスクに送信/*固定ユーザー名文字列aa = "1.jpg"; //中国語の場合は、AA = urlencoder.encode(aa、 "utf-8")をエンコードする必要があります。 response.setheader( "content-disposition"、 "attachment; filename = '"+aa+"'"); //// "attachment;"を追加する必要があります。 getOutputStream(); Substring(num+1);処分 "、" attachment; filename = '"+aa+"' "); //そこからファイル名を渡すと、文字列filename = this.getServletContext()。getRealPath(name); // new fileinputStream(filename)を入力します。書き込み(b、0、len);}}} </span> <span style = "font-size:18px;"> </span>上記はこの記事に関するものです。みんなの学習に役立つことを願っています。