[html、jsp、java]ファイルのアップロード


こんにちは.😀. 今日、jspの組み込みオブジェクトにファイルを送信し、画面に出力する方法を説明します.

JSP内蔵オブジェクト


JSPに組み込まれているオブジェクトは次のとおりです.
オブジェクトjavaxはrequestjavaxを説明します.servlet.http.HttpServletRequest, javax.servlet.サーブレットRequest Webブラウザの要求情報を格納するオブジェクトresponsejavax.servlet.http.HttpServletResponse, javax.servlet.サーブレットResponseは、Webブラウザが応答情報を要求するオブジェクトoutjavaxを格納します.servlet.jsp.出力ストリームオブジェクトsessionjavaxは、JspWriterJSPページで出力する内容を含む.servlet.http.サーブレットContextは、1つのWebブラウザでメンテナンスするオブジェクトアプリケーションjavaxのセッション情報を保存します.servlet.ServiceletContext WebアプリケーションにContext情報を含むオブジェクトpageContextjavax.servlet.jsp.PageContextJSPページ情報を格納するオブジェクトPagejava.lang.ObjectJSPページのJavaクラスオブジェクトconfigjavaxを実装します.servlet.サーブレットコンフィグJSPページ設定情報を含むオブジェクトExceptionjava.lang.ThrowableJSPページで異常が発生した場合に使用するオブジェクト

enctype : multipart/form-data


enctype

application/x-www-form-urlencoded
	&으로 분리되고, "=" 기호로 값과 키를 연결하는 key-value tuple로 인코딩되는 값입니다. 
	영어 알파벳이 아닌 문자들은 percent encoded 으로 인코딩됩니다. 
	content type은 바이너리 데이터에 사용하기에는 적절치 않습니다. 
multipart/form-data
	파일이나 이미지를 서버로 전송할 때 주로 사용
  
text/plain
	공백 문자(space)는 “+” 기호로 변환,
	나머지 문자는 모두 인코딩되지 않음
ファイルをjspに送信するとPOST方式で送信し、enctypeはmultipart/form-data方式で送信する.
サンプルファイルの送信
<h3>FILE UPLOAD</h3>
<hr>
<form name="fileUploadForm"
	  action="/Context/velog/velog_file.jsp"
	  method="POST"
	  enctype="multipart/form-data">
이름1 : <input type="text" name="name"><br>
파일1 : <input type="file" name="fileName1"><br>
파일2 : <input type="file" name="fileName2"><br>	
<input type="submit" value="전송">  
</form>
  • コンテキストは、現在のコンテキスト(Webプロジェクト名またはWebアプリケーションまたはドメインまたはプロジェクト)の名前です.
  • 画面

    🤔 .JSPはどのようにファイルを受信しますか?
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>  
        <%@ page import="com.oreilly.servlet.MultipartRequest" %>   
    <%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>    
    <%@ page import="java.io.File" %>         
    <%@ page import="java.util.Enumeration" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <%
    	String saveDirectory=pageContext.getServletContext().getRealPath("/upload/aaaa/");
    	out.println("saveDirectory >>> : "+saveDirectory+"<br>");
    	
    	File saveDir=new File(saveDirectory);
    	
    	if(!saveDir.exists()){
    		saveDir.mkdirs();
    	}
    	
    	int maxPostsize=1024*1024*5;
    	String encoding="UTF-8";
    	String filename1="";
    	String filename2="";
    	
    
    	try{		
    		MultipartRequest mr=new MultipartRequest(request, 
    				saveDirectory, maxPostsize, encoding, new DefaultFileRenamePolicy());
    		out.println("mr 참조변수 가지고 서버에 업로드된 파일 정보. <br>");
    		
    		// name
    		String name=mr.getParameter("name");
    		out.println("name >>> : "+name+"<br>");
    		
    		// file
    		Enumeration<String> files=mr.getFileNames();
    		
    		String file1=String.valueOf(files.nextElement());
    		filename1=mr.getFilesystemName(file1);
    		out.println("filename1 >>> : "+filename1+"<br>");
    		
    		String file2=String.valueOf(files.nextElement());
    		filename2=mr.getFilesystemName(file2);
    		out.println("filename2 >>> : "+filename2+"<br>");
    		
    		
    	}catch(Exception e){
    		System.out.println("에러가 >>> : "+e.getMessage());
    	}
    %>
    <h3>File Upload Testing</h3>
    <hr>
    <table border="1">
    <tr align="center">
    	<td><%= filename1 %></td>
    	<td><img src="/Context/upload/aaaa/<%= filename1 %>"></td>
    </tr>
    <tr>
    	<td><%= filename2 %></td>
    	<td><img src="/Context/upload/aaaa/<%= filename2 %>"></td>
    </tr>
    </table>
    <body>
    </body>
    </html>

    コードプール付きJSPでファイルを出力する


    pageContext.getServletContext().getRealPath("path");
    Servlet 3.1 - Apache Tomcat 8.0.53からjavaxへ.servlet.サーブレットコンフィグインタフェースクラスにはgetServiceletContext()関数が含まれます.
    ✔ Method Summary
    Modifier and Type | Method and Description
    
    ServletContext	  |	getServletContext()	
    
    Returns: Returns a reference to the ServletContext in which the caller is executing.
    また、getRealPath(「path」)についてjavax.servlet.サーブレットContextインタフェースクラスにはgetRealPath(java.lang.Stringpath)が含まれています.
    ✔ Method Summary
    Modifier and Type | Method and Description
    
    java.lang.String  |	getRealPath(java.lang.String path)
    
    Returns: Returns a String containing the real path for a given virtual path. For example, the path "/index.html" returns the absolute file path on the server's filesystem would be served by a request for "http://host/contextPath/index.html", where contextPath is the context path of this ServletContext..
    これらの関数を使用して、サーブレットContextのobjectに戻り、指定した仮想パスを実際のパスに貼り付け、saveDirectory変数をStringデータ型に入れます.
    new File(saveDirectory)
    File(String pathname)
    		Creates a new File instance by converting the given pathname 
    		string into an abstract pathname.
    指定したパスを使用して新しいファイルを作成します.
    new MultipartRequest(parameters)
    MultipartRequest(javax.servlet.http.HttpServletRequest request, java.lang.String saveDirectory, int maxPostSize, java.lang.String encoding, FileRenamePolicy policy)
    
              Constructs a new MultipartRequest to handle the specified request, saving any uploaded files to the given directory, and limiting the upload size to the specified length.
    各パラメータをパラメータに代入し、ファイルを指定したパスにアップロードします.
    🤔 なぜFilenRenamePolicyポリシーの場所に他のクラスのジェネレータを入力しますか?

    servlets.comのAPIでは、FileRenamePolicyはインタフェースクラスであり、このクラスを継承するクラスはDefaultFileRenamePolicyである.このインタフェースクラスの継承クラスインスタンスからジェネレータが生成されます.
    com.oreilly.servlet.multipart
    Class DefaultFileRenamePolicy
    
    public class DefaultFileRenamePolicy
    extends java.lang.Object
    implements FileRenamePolicy
    
    
    Implements a renaming policy that adds increasing integers to the body of any file that collides. For example, if foo.gif is being uploaded and a file by the same name already exists, this logic will rename the upload foo1.gif. A second upload by the same name would be foo2.gif. Note that for safety the rename() method creates a zero-len
    インスタンスがクラスに属している場合は、同じファイルを保存すると、後で数値が追加されます.
    ex) velog.jpg, velog1.jsp, velog2.jsp....
    String name=mr.getParameter("name");

    com.oreilly.servlet.MultipartRequestクラスの参照変数で、パラメータの名前をString nameとして保存します.

    画面に入力した値は、名前1に保存されます.
  • 注意:request.getParameterとは違います.
  • Enumeration files=mr.getFileNames();
    getFileNames
    public java.util.Enumeration getFileNames()
    
    Returns the names of all the uploaded files as an Enumeration of Strings. It returns an empty Enumeration if there are no file input fields on the form. Any file input field that's left empty will result in a FilePart with null contents. Each file name is the name specified by the form, not by the user.
    
    Returns:
    the names of all the uploaded files as an Enumeration of Strings.
    アップロードされたファイルの名前をクライアントインタフェースクラスに含めます.
    String file1=String.valueOf(files.nextElement());
    java.util.Enumeration<E>
    		files.nextElement()
    		
    		Returns the next element of this enumeration 
    		if this enumeration object has at least one more element to provide.
    		
    		Returns:
    			the next element of this enumeration.
    			
    		java.lang.String
    		String : valueOf(Object obj)
    		Returns:
    			the next element of this enumeration.
    次に、Enumerationインタフェースクラスでファイル名を検索し、file 1と名前を付けます.
    filename1=mr.getFilesystemName(file1);
    java.lang.String : 
    			
    	getFilesystemName(java.lang.String name)
    	    Returns the filesystem name of the specified file, 
    	    or null if the file was not included in the upload.
    filename 1に正常に出力された場合、ファイルは正常にアップロードされたと考えられます.

    すべての画像がアップロードされていることを確認したら、画像パスを位置決めして出力できます.

    入力値と結果値のチェック


    入力値

    結果値

    ✔saveDirectoryビューの注意点
    String saveDirectory=pageContext.getServletContext().getRealPath("/upload/aaaa/");
    次のコードでは、クリップのパスは実際の画像の保存パスとは異なります.
    最もエラーが発生しやすいのは、ワークスペース内のsrcまたはWebContentに実際の画像が存在するパスだと思いますが、実際にはそうではありません.
    たとえば、
    C:\..workspace..\Context\WebContent\image\img_kakao\
    パス内の画像が転送された場合、実際にアップロードされたパスは次のようになります.
    saveDirectory >>> : C:\..workspace..\Context\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\Context\upload\aaaa\
    これで、[html、jsp、java]ファイルをアップロードするタスクを完了します.