Java 如何使用 servlet 将图像保存在我的项目文件夹中?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/22965822/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 19:41:02  来源:igfitidea点击:

How to save the image in my project folder using servlets?

javaservletsfile-upload

提问by tajMahal

<body>
    <form method="post" action="FileUploadServlet" enctype="multipart/form-data" name="form1">
        <input type="file"  name="file" />
        <input type="submit" value="upload"/>
    </form>
</body>

This is my index.jsp,when i submit it goes to FileUploadServlet.i.e.,

这是我的 index.jsp,当我提交到 FileUploadServlet.ie 时,

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    boolean isMultiPart = ServletFileUpload.isMultipartContent(request);
    if (isMultiPart) {
        ServletFileUpload upload = new ServletFileUpload();
        try {
            FileItemIterator itr = upload.getItemIterator(request);
            while (itr.hasNext()) {
                FileItemStream item = itr.next();
                if (item.isFormField()) {
                    String fieldname = item.getFieldName();
                    InputStream is = item.openStream();
                    byte[] b = new byte[is.available()];
                    is.read(b);
                    String value = new String(b);
                    response.getWriter().println(fieldname + ":" + value + "</br>");
                } else {
                    String path = getServletContext().getRealPath("/");
                    if (FileUpload.processFile(path, item)) {
                        response.getWriter().println("Upload Success");
                    } else {
                        response.getWriter().println("Upload Failed");
                    }
                }
            }
        } catch (FileUploadException fue) {
            fue.printStackTrace();
        }
    }
}

This is my Servlet and the following code is FileUpload java class

这是我的 Servlet,下面的代码是 FileUpload java 类

public class FileUpload {

public static boolean processFile(String path, FileItemStream item) {
    try {
        File f = new File(path + File.separator + "images");
        if(!f.exists()) {
            f.mkdir();
        }
        File savedFile=new File(f.getAbsolutePath()+File.separator+item.getName());
        FileOutputStream fos=new FileOutputStream(savedFile);
        InputStream is=item.openStream();
        int x=0;
        byte[]b=new byte[1024];
        while((x=is.read(b))!=-1){
            fos.write(b,0,x);
        }
        fos.flush();
        fos.close();
        return true;
    }catch(Exception e){
        e.printStackTrace();
    }
    return false;
}

}

}

This is working fine but the problem is when image file is uploaded that are saving in `C:\Users\XYZ\Documents\NetBeansProjects\ImageUpload\build\web\images) but my requirement is image has to store inside project folder called images i.e.,(C:\Users\xyz\Documents\NetBeansProjects\ImageUpload\web\images),can you guide me where to change the code.

这工作正常,但问题是当图像文件上传时保存在 `C:\Users\XYZ\Documents\NetBeansProjects\ImageUpload\build\web\images) 但我的要求是图像必须存储在名为图像的项目文件夹中即,(C:\Users\xyz\Documents\NetBeansProjects\ImageUpload\web\images),你能指导我在哪里更改代码。

Thanks in advance.

提前致谢。

回答by codefreaK

Okay i will give you the shoretest and easiest solution

好的,我会给你最简单和最简单的解决方案

  • First create the servlet and add following lines to at top servlet clas
  • @WebServlet(name = "FileUploadServlet", urlPatterns = {"/upload"})
  • @MultipartConfig
  • Then inside post method copy and paste the content inside post method that i have posted below then

  • Then Copy the funciton getFileName and paste it below doPost() method

  • 首先创建 servlet 并将以下行添加到顶部 servlet 类
  • @WebServlet(name = "FileUploadServlet", urlPatterns = {"/upload"})
  • @MultipartConfig
  • 然后在post方法中复制并粘贴我在下面发布的post方法中的内容

  • 然后复制函数 getFileName 并将其粘贴到 doPost() 方法下面

The HTML form in tut-install/examples/web/fileupload/web/index.html is as follows:

tut-install/examples/web/fileupload/web/index.html中的HTML表单如下:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>File Upload</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <form method="POST" action="upload" enctype="multipart/form-data" >
            File:
            <input type="file" name="file" id="file" /> <br/>
            Destination:
            <input type="text" value="/tmp" name="destination"/>
            </br>
            <input type="submit" value="Upload" name="upload" id="upload" />
        </form>
    </body>
</html>


A POST request method is used when the client needs to send data to the server as part of the request, such as when uploading a file or submitting a completed form. In contrast, a GET request method sends a URL and headers only to the server, whereas POST requests also include a message body. This allows arbitrary-length data of any type to be sent to the server. A header field in the POST request usually indicates the message body's Internet media type.

When submitting a form, the browser streams the content in, combining all parts, with each part representing a field of a form. Parts are named after the input elements and are separated from each other with string delimiters named boundary.

This is what submitted data from the fileupload form looks like, after selecting sample.txt as the file that will be uploaded to the tmp directory on the local file system:

POST /fileupload/upload HTTP/1.1
Host: localhost:8080
Content-Type: multipart/form-data; 
boundary=---------------------------263081694432439
Content-Length: 441
-----------------------------263081694432439
Content-Disposition: form-data; name="file"; filename="sample.txt"
Content-Type: text/plain

Data from sample file
-----------------------------263081694432439
Content-Disposition: form-data; name="destination"

/tmp
-----------------------------263081694432439
Content-Disposition: form-data; name="upload"

Upload
-----------------------------263081694432439--
The servlet FileUploadServlet.java can be found in the tut-install/examples/web/fileupload/src/java/fileupload/ directory. The servlet begins as follows:

@WebServlet(name = "FileUploadServlet", urlPatterns = {"/upload"})
@MultipartConfig
public class FileUploadServlet extends HttpServlet {

    private final static Logger LOGGER = 
            Logger.getLogger(FileUploadServlet.class.getCanonicalName());

The @WebServlet annotation uses the urlPatterns property to define servlet mappings.

@WebServlet 注释使用 urlPatterns 属性来定义 servlet 映射。

The @MultipartConfig annotation indicates that the servlet expects requests to made using the multipart/form-data MIME type.

@MultipartConfig 注释表明 servlet 期望使用 multipart/form-data MIME 类型发出请求。

The processRequest method retrieves the destination and file part from the request, then calls the getFileName method to retrieve the file name from the file part. The method then creates a FileOutputStream and copies the file to the specified destination. The error-handling section of the method catches and handles some of the most common reasons why a file would not be found. The processRequest and getFileName methods look like this:

processRequest 方法从请求中检索目标和文件部分,然后调用 getFileName 方法从文件部分检索文件名。然后该方法创建一个 FileOutputStream 并将文件复制到指定的目的地。该方法的错误处理部分会捕获并处理一些找不到文件的最常见原因。processRequest 和 getFileName 方法如下所示:

protected void processRequest(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");

    // Create path components to save the file
    final String path = request.getParameter("destination");
    final Part filePart = request.getPart("file");
    final String fileName = getFileName(filePart);

    OutputStream out = null;
    InputStream filecontent = null;
    final PrintWriter writer = response.getWriter();

    try {
        out = new FileOutputStream(new File(path + File.separator
                + fileName));
        filecontent = filePart.getInputStream();

        int read = 0;
        final byte[] bytes = new byte[1024];

        while ((read = filecontent.read(bytes)) != -1) {
            out.write(bytes, 0, read);
        }
        writer.println("New file " + fileName + " created at " + path);
        LOGGER.log(Level.INFO, "File{0}being uploaded to {1}", 
                new Object[]{fileName, path});
    } catch (FileNotFoundException fne) {
        writer.println("You either did not specify a file to upload or are "
                + "trying to upload a file to a protected or nonexistent "
                + "location.");
        writer.println("<br/> ERROR: " + fne.getMessage());

        LOGGER.log(Level.SEVERE, "Problems during file upload. Error: {0}", 
                new Object[]{fne.getMessage()});
    } finally {
        if (out != null) {
            out.close();
        }
        if (filecontent != null) {
            filecontent.close();
        }
        if (writer != null) {
            writer.close();
        }
    }
}

private String getFileName(final Part part) {
    final String partHeader = part.getHeader("content-disposition");
    LOGGER.log(Level.INFO, "Part Header = {0}", partHeader);
    for (String content : part.getHeader("content-disposition").split(";")) {
        if (content.trim().startsWith("filename")) {
            return content.substring(
                    content.indexOf('=') + 1).trim().replace("\"", "");
        }
    }
    return null;
}

## Code to Add File to a folder Dynamically ##

##动态添加文件到文件夹的代码##

 String filePath = "D:\folder1Name\folder2Name\";




if (request.getPart("file") != null) {
            if (request.getPart("file").getSize() != 0) {
                System.out.println(UName + "UName" + "LoopilKeri");
                final Part filePart = request.getPart("file");
                String folderName = filePath + UName + "//file";//path;
                final String fileName = getFileName(filePart);
                //
                 File file = new File(folderName);
                  if (!file.exists()) {
                 file.mkdirs();
                 }

                OutputStream out = null;
                InputStream filecontent = null;
                final PrintWriter writer = response.getWriter();

                try {
                    out = new FileOutputStream(new File(folderName + File.separator
                            + fileName));
                    filecontent = filePart.getInputStream();
                    StringBuilder sb = new StringBuilder();
                    int read = 0;
                    final byte[] bytes = new byte[1024];
                // byte[] byte1 = new byte[1024];
                    //   byte1=IOUtils.toByteArray(filecontent);
                    //  System.out.println(byte1.toString()); 
                    while ((read = filecontent.read(bytes)) != -1) {
                        sb.append(bytes);
                        System.out.println(bytes);
                        System.out.println(bytes + "0here" + read);

                        out.write(bytes, 0, read);

                    }
                    // writer.println("New file " + fileName + " created at " + folderName);
                    System.out.println("###########################################################################");
                    System.out.println(sb.toString());
                    request.setAttribute("f1", folderName);
                    request.setAttribute("f2", fileName);
                    //   request.setAttribute("f", byte1);
                    System.out.println(sb);
                    System.out.println("###########################################################################");
                    ServletContext se = this.getServletContext();
                // RequestDispatcher rd =se.getRequestDispatcher("/NewServlet");
                    // rd.forward(request, response);
                    //      LOGGER.log(Level.INFO, "File{0}being uploaded to {1}", 
                    //              new Object[]{fileName, folderName});
                } catch (FileNotFoundException fne) {
//                writer.println("You either did not specify a file to upload or are "
//                        + "trying to upload a file to a protected or nonexistent "
//                        + "location.");
//                writer.println("<br/> ERROR: " + fne.getMessage());

                    LOGGER.log(Level.SEVERE, "Problems during file upload. Error: {0}",
                            new Object[]{fne.getMessage()});
                } finally {
                    if (out != null) {
                        out.close();
                    }
                    if (filecontent != null) {
                        filecontent.close();
                    }
                    if (writer != null) {
                        writer.close();
                    }
                }
            }
        }

回答by JavaLearner1

first in servlet you need to mention

首先在servlet中你需要提到

@MultipartConfig(fileSizeThreshold=1024*1024*2, 
maxFileSize=1024*1024*10, 
maxRequestSize=1024*1024*50)

Setting the file size and then you should mention the path and try to save in database.

设置文件大小,然后你应该提到路径并尝试保存在数据库中。

you can see the complete code HERE

你可以在这里看到完整的代码