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

时间:2014-04-09 14:33:33

标签: java servlets file-upload

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

这是我的index.jsp,当我提交它时会转到FileUploadServlet.i.e。,

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();
        }
    }
}

这是我的Servlet,以下代码是FileUpload java class

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;
}

}

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

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());

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

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

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;
}

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

 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();
                    }
                }
            }
        }

答案 1 :(得分:1)

首先在servlet中提到

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

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

您可以看到完整的代码HERE