0

私は Java サーブレット プログラミングを学んでいて、ファイルをアップロードするプログラムを書きましたが、そのプログラムで奇妙な問題が発生しています。ファイルのアップロードが完了したと表示され、リンクをクリックして表示すると404エラーが発生し、ディレクトリ(ファイルが保存されるはずの場所)を確認すると空です。ログを確認しましたが、エラー メッセージはありません。コードは、サーブレットと JSP の学習に使用している本から取得しました。

ここに私のJavaコードがあります

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

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

/**
 * Servlet implementation class FileUpload
 */
@WebServlet("/FileUpload")
public class FileUpload extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public FileUpload() {
        super();
        // TODO Auto-generated constructor stub
    }


    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        out.println("<html>");
        out.print("File upload success. <a href=\"/Project_One/files");
        out.print("\">Click here to browse through all uploaded ");
        out.println("files.</a><br>");

        ServletInputStream sis = request.getInputStream();
        StringWriter sw = new StringWriter();
        int i = sis.read();
        for(;i!=-1 && i!= '\r';i=sis.read())
            {
                sw.write(i);
            }
        sis.read(); //ditch \'n'
        String delimiter = sw.toString();


        while(true)
            {
                StringWriter h = new StringWriter();
                int[] temp = new int[4];
                temp[0] = (byte)sis.read();
                temp[1] = (byte)sis.read();
                temp[2] = (byte)sis.read();
                h.write(temp[0]);
                h.write(temp[1]);
                h.write(temp[2]);

                //read header
                for(temp[3]=sis.read();temp[3]!=-1;temp[3]=sis.read())
                    {
                        if(temp[0] == '\r' &&
                           temp[1] == '\n' &&
                           temp[2] == 'r'  &&
                           temp[3] == '\n')
                            {
                                break;
                            }

                        h.write(temp[3]);
                        temp[0]= temp[1];
                        temp[1]= temp[2];
                        temp[2]= temp[3];   
                    }
                String header = h.toString();

                int StartName = header.indexOf("name=\"");
                int endName = header.indexOf("\"",StartName+6);
                if(StartName == -1|| endName == -1)
                    {
                        break;
                    }
                String name = header.substring(StartName+6,endName);
                if(name.equals("file"))
                    {
                        StartName = header.indexOf("filename=\"");
                        endName = header.indexOf("\"",StartName+10);
                        String filename = header.substring(StartName+10,endName);
                        ServletConfig config = getServletConfig();
                        ServletContext sc = config.getServletContext();

                        //File file = new File(sc.getRealPath("/files"));
                        //file.mkdirs();
                        FileOutputStream fos = new FileOutputStream(sc.getRealPath("/")+"/"+filename);

                        //write the file to disk 
                        int length = delimiter.length();
                        //delimiter ="\r\n"+delimiter;
                        byte[] body = new byte[delimiter.length()];
                        for(int j=0;j<body.length-1;j++)
                            {
                                body[j]=(byte)sis.read();
                                fos.write(body[j]);
                            }

                        //check it wasn't a 0 length file
                        //if(!delimiter.equals(new String (body)))
                            //{
                                int e = body.length-1;
                                i=sis.read();
                                for(;i!=-1;i=sis.read())
                                    {
                                        body[e]=(byte)i;
                                        /*fos.write(body[0]);
                                        for(int l=0;l<body.length-1;l++)
                                            {
                                                body[l]=body[l+1];
                                            }*/
                                        //body[e]=(byte)i;

                                        if(delimiter.equals(new String (body)))
                                            {
                                                break;
                                            }
                                        //length++;
                                        fos.write(body[e]);
                                        for(int k=0;k<body.length-1;k++)
                                            {
                                                body[k]=body[k+1];

                                            }
                                        length++;
                                    }

                        fos.flush();
                        fos.close();
                        out.println("<p><b>Saved File:</b>"+filename+"</p>");
                        out.println("<p><b>Length:</b>"+ length+"</p>");
                    }
                if(sis.read() == '-' && sis.read()=='-')
                    {
                        break;
                    }

                    }
        out.println("</html>");


            }



    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doPost(request,response);
    }



}

コードに加えられた変更はほとんどなく、変更は本に記載されていました。ここに私のHTMLコードがあります

<html>
    <head>
        <title>Test HTML Form</title>
    </head>
    <body>
    <p>Select a file to upload or <a href="/Project_One/files/">browse currently uploaded files.</a></p>
    <form action="http://127.0.0.1/Project_One/FileUpload"
          method="post" enctype="multipart/form-data">
          File:<input type="file" name:"file"><br>
          <input value="Upload File" type="submit">
    </form>
    </body>
</html>

これにはTomCatサーバーを使用しています。

4

2 に答える 2

1

このコードはどこから入手しましたか? 10 年前のサーブレットのチュートリアル/本から? これはすべて不必要に複雑です。1 年以内の最新のチュートリアル/本を読んでいることを確認してください。

標準のサーブレット 3.0 API を使用してファイルをアップロードする方法は次のとおりです。

@MultipartConfig
@WebServlet("/FileUpload")
public class FileUpload extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part filePart = request.getPart("file"); // Retrieves <input type="file" name="file">
        String filename = getFilename(filePart);
        InputStream filecontent = filePart.getInputStream();
        // ... (do your job here)
    }

    private static String getFilename(Part part) {
        for (String cd : part.getHeader("content-disposition").split(";")) {
            if (cd.trim().startsWith("filename")) {
                String filename = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
                return filename.substring(filename.lastIndexOf('/') + 1).substring(filename.lastIndexOf('\\') + 1); // MSIE fix.
            }
        }
        return null;
    }

}

それで全部です。また、適切なファイル名が返されることも考慮されています。MSIE などの一部のブラウザでは、ファイル名にクライアント側の完全なパスが誤って含まれています。それがあなたの問題の原因かもしれません。

さらに、直接関係のない他の 2 つの問題があります。

  1. アップロードしたファイルを deploy フォルダーに保存しないでください。Web アプリケーションを再デプロイするたびに失われます。deploy フォルダ以外の固定パスにファイルを保存します。たとえば、Java webapp でサーバー上の画像を保存および取得する方法も参照してください。

  2. HTML を生成するジョブを JSP に委任する必要があります。の最後でdoPost()、リクエストを JSP に転送します。

    request.getRequestDispatcher("/WEB-INF/uploadresult.jsp").forward(request, response);
    

以下も参照してください。

于 2012-04-19T12:07:21.643 に答える
1

このコードは少し読みにくいと思いますが、エラーが発生する可能性のあるポイントがいくつかあります。まず、この部分です。

    out.println("<html>");
    out.print("File upload success. <a href=\"/Project_One/files");
    out.print("\">Click here to browse through all uploaded ");
    out.println("files.</a><br>");

この部分では、リンクは Project_One/files を指していますが、ファイルを書き込むと:

    FileOutputStream fos = new FileOutputStream(sc.getRealPath("/")+"/"+filename);

ファイルを Project_One フォルダーに直接書き込みます (html ポイントの files フォルダーではありません)。そのため、ファイルがワークスペースのメイン フォルダーに書き込まれたかどうかを確認できます。

とにかく、次のようなコードをよりよく理解できると思います:

  MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) req;
  MultipartFile multipartFile = multipartRequest.getFile("file");
  byte[] content =multipartFile.getBytes();
  File archivoParaGuardar= new File("/your_directory/"+multipartFile.getOriginalFilename());
  try {
    baos.write(content);
    FileOutputStream fos = new FileOutputStream(archivoParaGuardar);
    baos.writeTo(fos);
    fos.close();
  } catch (Exception e) {
   logger.error("Error saving file ", e);
  }

これがお役に立てば幸いです。

于 2012-04-19T11:29:57.553 に答える