1。ファイルアップロードの原理の分析
1.ファイルアップロードに必要な前提条件
a。フォームの方法は投稿する必要があります
b。フォームのenctypeプロパティは、型MultiPart/form-dataでなければなりません。
Enctypeデフォルト値:Application/X-WWW-Form-Urlencoded
機能:リクエストテキストのMIMEタイプをサーバーに伝えます
Application/x-www-form-urlencoded:username = abc&password = 123
ServletRequest.getParameter(String name);この方法は、このタイプを具体的に読み取る方法です
MultiPart/Form-Data:
2. Commons-Fileuploadコンポーネントを使用してファイルをアップロードします
a。 JARパッケージをコピー:commons-fileupload.jar commons-io.jar
b。実装の原則
3.ゴミコードの問題
a。通常のフィールドのごみコード
fileitem.getString(string charset);エンコーディングはクライアントと一致する必要があります
b。アップロードされた中国のファイル名は文字化けされています。
request.setcharacterencoding( "utf-8");エンコーディングは、クライアントと一致する必要があります
4。特定の実装
フロントデスクのコードupload.jspは次のとおりです
<%@ page Language = "Java" Import = "Java.util。*" PageEncoding = "UTF-8"%> <!doctype HTML public " - // w3c // dtd html 4.01 transitional // en"> <html> <head> <title> upload </<meta htp-equaiv = "papama content = "no-cache"> <meta http-equiv = "cache-control" content = "no-cache"> <meta http-equiv = "content" content = ""> <! - <link rel = "styleSheet" type = "text/css" href = "style.css" action = "$ {pagecontext.request.contextpath}/servlet/uploadservlet3" method = "post" enctype = "multipart/form-data"> name:<input name = "name"/> <br/> file1:<入力タイプ= "ファイル" name "name =" f1 "/> type = "submit" value = "upload"> </form> </body> </html>背景サーブレットコード
パッケージcom.itheima.servlet; import java.io.file; Import java.io.io.ioexception; Import java.io.io.printwriter; Import java.io.usupportedencodingincection; import java.util.list; import java.util.uuid; import.servlet.servleteletexcection; javax.servlet.http.httpservlet; Import javax.servlet.http.httpservletrequest; Import javax.servlet.servlet.httpservletresponse; Import org.apache.commons.fileupload.fileitem; Import apache.commons.fileupload.fileuploadbase; Import org.apache.commons.fileupload.fileuploadexception; Import org.apache.commons.fileupload.disk.diskfileItemactory; Import org.apach.apach.filepload.servled.servled.servled.servled.servled.servled. org.apache.commons.io.filenameutils; // public class uploadservlet3の詳細な説明httpservlet {public void doget(httpservletrequest request、httpservletresponse応答)Servletexception、ioException {request.setcharacterencoding( "utf-8"); respons.setcontenttype( "text/html; charset = utf-8"); printwriter out = respons.getWriter(); system.out.print(request.getRemoteaddr(); boolean ismultipart = servletfileupload.ismultipartcontent(request); if(!ismultipart){show new runtimeexception( "フォームのenctypeプロパティを確認して、それがマルチパート/フォームデータであることを確認してください);} diskfileitemactory dfif = new diskfileitemactory(); servletfileupload(dfif); // parser.setfilesizemax(3*1024*1024); //単一のファイルアップロードのサイズ// parser.setsizemax(6*1024*1024); parser.parserequest(request);} catch(fileuploadbase.filesizelimitex ceededexception e){out.write( "uploadfileは3mを超えています");} catch(fileuploadbase.sizelimitexedededexception E) {e.printstacktrace();新しいruntimeexception( "Parseアップロードコンテンツが失敗し、再試行してください") processuploadfield(fileitem item){try {string filename = item.getName(); // if(filename!= null &&!filename.equals( "")){filename = uuid.randomuid()。toString()。toString()。 filenameutils.getExtension(fileName); // mimeタイプstring contentType = item.getContentType(); if(contentType.startswith( "image/")){// new = new date(); // dateformat df = new simpledateFormat( "ファイル名のハッシュコードに従ってストレージディレクトリを計算しますstring string childdirectory = makechilddirectory(getServletContext()。getRealPath( "/web-inf/files/")、filename); string storedirectorypath = getServletContext()。 file(storedirectorypath); if(!storedirectory.exists()){storedirectory.mkdirs();} system.out.println(filename); ite(new file(storedirectorypath+file.separator+filename); //削除一時ファイル});保存されているサブディレクトリプライベートストリングMakeChildDirectory(String RealPath、String Filename){int hashcode = filename.hashcode(); int dir1 = hashcode&0xf; // 1〜4ビットint dir2 =(ハッシュコード&0xf0)>> new file(realpath、directory); if(!file.exists())file.mkdirs(); return directory;} private void processfield(fileitem iteque){string fieldname = item.get.get.get.get.fieldValue; try {fieldValue = item.getString( "utf-8");} catch(} citch(} catch expertedexexed(} runtimeexception( "utf-8エンコードはサポートされていません");} system.out.println(fieldname+"="+fieldvalue);} public void dopost(httpservletrequest request、httpservletresponse応答)スローServletexcection、ioexception {request(request);}5。一時的な文書について
a。 DiskFileItemFactory
public void setRepository(ファイルリポジトリ):一時ファイルが保存されている場合のディレクトリをパブリックボイドsetsizethReshold(int sizethreshold):キャッシュサイズを設定します
b。
ファイルをアップロードするときは、IOストリームを使用して自分で処理します。ストリームが閉じた後は、必ず一時ファイルを削除してください。 fileitem.delete()
fileitem.writer(ファイルf)を使用することをお勧めします。一時ファイルは自動的に削除されます。
6.ファイルサイズを制限します
a。
servletfileupload.setfilesizemax(3*1024*1024); //単一のファイルアップロードのサイズを設定します
b。
servletfileupload.setsizemax(6*1024*1024); //複数のファイルをアップロードするときの合計サイズ制限
上記は、エディターが導入したCommons Fileupload実装ファイルのアップロードの例です。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!