2016-10-10 5 views
1

のうちバイト[]コンテンツの取得:Javaサーブレット - 私は形で、以下の入力を持つJSPページ作ったHTMLファイルの入力

<input type="file" name="image" id="image" accept="image/*">

そして提出走るボタンを( )。

送信された情報はサーブレットで処理されますが、 "image"パラメータからバイト(バイト配列 - バイト[])を取得する必要があります。

可能ですか?私はそれを探していましたが、それを見つけることができませんでした。 reddit.com/r/javahelp上/ U/jmeisner707によって

ソリューション:フォームにenctype="multipart/form-data"とサーブレットに次のコードを記述します:

は、タグを追加した後

Part part = request.getPart("image"); InputStream = part.getInputStream();

を入力ストリームからバイト配列を取り出せるようにするには、サーブレットに次のアノテーションを追加する必要があります。

`@MultipartConfig

@WebServlet(
    name = "Servlet", 
    urlPatterns = { "/url"}, 
    loadOnStartup = 1 

) `

あなたの答えをいただき、ありがとうございます。

+0

「パラメータ」とはどういう意味ですか?サーブレットが受け取ったイメージファイルのバイトからバイト配列を取得したいのですか? – Dave0504

答えて

0

ファイルを2つに分けて、まずファイルを取得し、ファイルからバイト配列を取得します。

このチュートリアルでファイルを入手してください。

Fie upload to Sevlets

その後IOとバイトストリームのためのOracleのサイトからこの道を見てください。あなたは両方を介して作業したら、それを解決することができるはずです。この回答へのコメントに関連して

Basic I/O


UPDATE

、サーバーからのFileInputStreamおよびファイルを使用して作業実装は、チュートリアルを少し変更したバージョンを使用して以下に示します。 。それは最良の方法ではないかもしれませんが、うまくいきます。

package cmpdhoug; 

import java.io.*; 
import java.util.*; 

import javax.servlet.ServletConfig; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.MultipartConfig; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.FileUploadException; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import org.apache.commons.io.output.*; 


@WebServlet (
     name = "UploadServlet", 
     urlPatterns = "/UploadServlet", 
     loadOnStartup = 1 
) 
public class UploadServlet extends HttpServlet { 

    private boolean isMultipart; 
    private String filePath, tempPath; 
    private int maxFileSize = 5242880; 
    private int maxMemSize = 5 * 1024; 
    private File file ; 

    public void init(){ 
     // Get the file location where it would be stored. 
     filePath = 
       getServletContext().getInitParameter("file-upload"); 
     tempPath = getServletContext().getInitParameter("temp-upload"); 
    } 
    public void doPost(HttpServletRequest request, 
         HttpServletResponse response) 
      throws ServletException, java.io.IOException { 
     // Check that we have a file upload request 
     isMultipart = ServletFileUpload.isMultipartContent(request); 
     response.setContentType("text/html"); 
     java.io.PrintWriter out = response.getWriter(); 
     if(!isMultipart){ 
      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Servlet upload</title>"); 
      out.println("</head>"); 
      out.println("<body>"); 
      out.println("<p>No file uploaded</p>"); 
      out.println("</body>"); 
      out.println("</html>"); 
      return; 
     } 
     DiskFileItemFactory factory = new DiskFileItemFactory(); 
     // maximum size that will be stored in memory 
     factory.setSizeThreshold(maxMemSize); 
     // Location to save data that is larger than maxMemSize. 
     factory.setRepository(new File(tempPath)); 

     // Create a new file upload handler 
     ServletFileUpload upload = new ServletFileUpload(factory); 
     // maximum file size to be uploaded. 
     upload.setSizeMax(maxFileSize); 

     try{ 
      // Parse the request to get file items. 
      List fileItems = upload.parseRequest(request); 

      // Process the uploaded file items 
      Iterator i = fileItems.iterator(); 

      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Servlet upload</title>"); 
      out.println("</head>"); 
      out.println("<body>"); 
      while (i.hasNext()) 
      { 
       FileItem fi = (FileItem)i.next(); 
       if (!fi.isFormField()) 
       { 
        // Get the uploaded file parameters 
        String fieldName = fi.getFieldName(); 
        String fileName = fi.getName(); 
        String contentType = fi.getContentType(); 
        boolean isInMemory = fi.isInMemory(); 
        long sizeInBytes = fi.getSize(); 
        // Write the file 
        if(fileName.lastIndexOf("\\") >= 0){ 
         file = new File(filePath + 
           fileName.substring(fileName.lastIndexOf("\\"))) ; 
        }else{ 
         file = new File(filePath + 
           fileName.substring(fileName.lastIndexOf("\\")+1)) ; 
        } 
        fi.write(file) ; 
        out.println("Uploaded Filename: " + fileName + "<br>"); 
       } 
      } 


      // Get byte stream from file uploaded to server. 
      FileInputStream fis = new FileInputStream(file); 
      byte[] byteArray = new byte[(int) file.length()]; 

      // Add the bytes from the file to the array 
      for(int j = 0; j < byteArray.length; j++){ 
       byteArray[j] = (byte)fis.read(); 
       // Just to show the bytes are in the array. 
       System.out.println(byteArray[j]); 
      } 
      fis.close(); 
      out.println("</body>"); 
      out.println("</html>"); 
     }catch(Exception ex) { 
      System.out.println(ex); 
     } 


    } 
    public void doGet(HttpServletRequest request, 
         HttpServletResponse response) 
      throws ServletException, java.io.IOException { 

     throw new ServletException("GET method used with " + 
       getClass().getName()+": POST method required."); 
    } 
} 

はまた、あなたは、サーバーがTomcatのインストールファイルがローカルにある場所とは異なるかもしれにアプリを展開どこまで正しいファイル・パスを提供するために、web.xmlファイルを更新していることを確認する必要があります。

web.xmlの

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 



<web-app> 
    <display-name>Archetype Created Web Application</display-name> 

    <context-param> 
    <param-name>file-upload</param-name> 
    <param-value>/Users/dave/Library/Caches/IntelliJIdea2016.2/tomcat/webapps/data/</param-value> 
    </context-param> 
    <context-param> 
     <param-name>temp-upload</param-name> 
     <param-value>/Users/dave/Library/Caches/IntelliJIdea2016.2/tomcat/webapps/temp/</param-value> 
    </context-param> 
</web-app> 

ポンポン(あなたがwebapps/datawebapps/tempフォルダを作成してください)。たとえば、私のTomcatのインストールは/dave/servers/Tomcat/であるが、私のサーバーは、以下の通りのparamsにデプロイします。依存関係を持つXML

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>UploadServlet</groupId> 
    <artifactId>UploadServlet</artifactId> 
    <packaging>war</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>UploadServlet Maven Webapp</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.1.0</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>commons-fileupload</groupId> 
     <artifactId>commons-fileupload</artifactId> 
     <version>1.3.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.commons</groupId> 
     <artifactId>commons-io</artifactId> 
     <version>1.3.2</version> 
    </dependency> 
    </dependencies> 
    <build> 
    <finalName>UploadServlet</finalName> 
    </build> 

インデックスファイル

<html> 
<head> 
    <title>File Uploading Form</title> 
</head> 
<body> 
<h3>File Upload:</h3> 
Select a file to upload: <br /> 
<form action="UploadServlet" method="post" 
     enctype="multipart/form-data"> 
    <input type="file" name="file" size="50" /> 
    <br /> 
    <input type="submit" value="Upload File" /> 
</form> 
</body> 
</html> 
+0

あなたの答えをありがとう、私は最初のリンクでチュートリアルを読んだが、私は全くそれを理解することができませんでした。これまでのところ、私は試しました: 'Part filePart = request.getParameter(" image "); InputStream is = filePart.getInputStream(); ' そして、InputStreamからバイトを取得しようとしましたが、filePartはnullです:/ – BrunoSG

+0

まずFileInputStreamをInputStreamではなく、read(byte [] b)バイトを配列に取得する。また、File型のオブジェクトを引数として取るコンストラクタもあります。 – Dave0504

+0

@ Dave0504 'InputStream'には同じメソッドがあり、開くファイルがある場合は' FileInputStream'しか使用できません。ここのデータはソケットからのものです。 'FileInputStream'のように' File'型のオブジェクトを取るコンストラクタはここでは役に立たない。また、無意味です。 – EJP

1

事は、私がバイトを取得する必要がある(バイト配列 - バイト[])「画像」パラメータのうち。

いいえ。リクエスト入力ストリームを取得し、標準のJavaコピーループを経由する必要がある場合はいつでも、バイトをコピーします。

+0

私は、入力ストリーム(「名前」という文字列)に他のパラメータが格納されていると思います。私はまだ入力ストリームを取得する必要がありますか? – BrunoSG

関連する問題