jspで簡単な画像アップロード機能を実現

5362 ワード

1まず1つのページを作って、アップロードするピクチャーを選択します
<body>
   <form action="uploadServlet" enctype="multipart/form-data" method="POST" >
     
      selectimage: <input type="file" name="myfile"/><br>
      <input type="submit" value="upload"/>
   </form>
</body>

注意enctype=「multipart/form-data」符号化でコミットする
2転送されたservletで転送された内容を読み取り、画像の情報を切り取り、ファイルを作成し、情報を保存し、画像のアップロードを実現した.
package com.zhou.action;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UploadServlet extends HttpServlet {

public UploadServlet() {
   super();
}

public void destroy() {
   super.destroy(); // Just puts "destroy" string in log
   // Put your code here
}

public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
   String contentType=request.getContentType();
   String servername=request.getServerName();
   String realpath=request.getRealPath(servername);
   System.out.println(contentType);

   InputStream in=null;
   OutputStream out=null;
   if(contentType.indexOf("multipart/form-data")>=0){
    in=request.getInputStream();
    int formlength=request.getContentLength();
    byte[] formcontent=new byte[formlength];
    int totalread=0;
    int nowread=0;
    while(totalread<formlength){
     nowread=in.read(formcontent,totalread, formlength);
     totalread+=nowread;
    }
    String strcontent=new String(formcontent);
    System.out.println(strcontent);
    int typestart=strcontent.indexOf("Content-Type:")+14;
    int typeend=strcontent.indexOf("
", typestart)-1; String formType=strcontent.substring(typestart, typeend); if(formType.equals("image/jpeg")||formType.equals("image/gif")||formType.equals("image/pjepg")){ int filenamestart=strcontent.indexOf("filename=\"")+10; int filenameend=strcontent.indexOf("
",filenamestart)-2; String filename=strcontent.substring(filenamestart, filenameend); filename=filename.substring(filename.lastIndexOf(".")); String newfilename=""+(new Date()).getDate()+(new Date()).getHours()+(new Date()).getMinutes()+(new Date()).getSeconds(); newfilename=newfilename+filename; realpath=realpath+""; newfilename=realpath+newfilename; int filestart=strcontent.indexOf("
",typestart)+1; filestart=strcontent.indexOf("
",filestart)+1; int intboundary=contentType.indexOf("boundary=")+10; String strboundary=contentType.substring(intboundary); int fileend=strcontent.indexOf(strboundary,filestart)-4; String saveFile=strcontent.substring(filestart,fileend); int contentstart=strcontent.substring(0,filestart).getBytes().length; int contentend=strcontent.substring(0, fileend).getBytes().length; System.out.println(saveFile); File myfile=new File(realpath); if(!myfile.exists()){ myfile.mkdirs(); } out=new FileOutputStream(newfilename); out.write(formcontent, contentstart, contentend-contentstart); response.sendRedirect("show.jsp"); }else{ response.sendRedirect("error.jsp"); } } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } public void init() throws ServletException { // Put your code here } }

3 xmlのservletを構成し、もちろんservlet構成を構築することができます.
<servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>uploadServlet</servlet-name>
    <servlet-class>com.zhou.action.UploadServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>uploadServlet</servlet-name>
    <url-pattern>/uploadServlet</url-pattern>
</servlet-mapping>

4実行プログラムを配置して、あなたの配置ディレクトリの下のlocalhostの下でuploadの中であなたのアップロードした画像を見ることができます.
フォームのenctype=「multipart/form-data」とは、アプリケーション/x-www-form-urlencodedであるフォームのMIME符号化のデフォルトを設定することを意味し、request.getParameterはフォームの内容を取得しますが、ファイルのアップロードにはバイナリのデータを受け入れる必要がありますmultipart/form-dataを使用してファイルデータを完全に転送する必要があります.以下の操作でこの設定を使用すると、getParameterで直接テキストの内容を取得するのではなく、1バイト配列でコンテンツを受信し、Stringタイプに変換します.