Jsp从webapps ROOT文件夹

时间:2016-08-10 09:50:44

标签: java image jsp servlets

我正在开发Java应用程序,我想要做的是向用户提供上传图像并在其配置文件中查看图像的功能。我知道类似的问题已被多次回答,但这是我第一次这样做,我真的很难让它发挥作用。

所以这是我的测试代码:

upload.jsp

...
<body>
    <form method="post" action="FileUploader" encType="multipart/form-data">
        <input type="file" name="file" value="select images..."/>
        <input type="submit" value="start upload"/>
    </form>
</body>
...

FileUploader.java

正如您在此处所见,我将所有图像存储在Tomcat的webapps/ROOT/files文件夹中。

@WebServlet("/FileUploader")
public class FileUploader extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();

        if(!ServletFileUpload.isMultipartContent(request)){
            out.println("Nothing to upload");
            return; 
        }
        FileItemFactory itemfactory = new DiskFileItemFactory(); 
        ServletFileUpload upload = new ServletFileUpload(itemfactory);
        try{
            List<FileItem>  items = upload.parseRequest(new ServletRequestContext(request));
            for(FileItem item:items){

                String contentType = item.getContentType();
                if(!contentType.equals("image/png")){
                    out.println("only png format image files supported");
                    continue;
                }
                File uploadDir = new File("/home/agg/apache-tomcat/webapps/ROOT/files");
                File file = File.createTempFile("img",".png",uploadDir);
                item.write(file);

                out.println("Filename: " + file.getName());
                out.println("File Saved Successfully");

                response.sendRedirect("message.jsp");
            }
        }
        catch(FileUploadException e){
            out.println("upload fail");
        }
        catch(Exception ex){
            out.println("can't save");
        }
    }
}

message.jsp

在这里,我正在尝试加载通过另一个servlet保存的其中一个图像。

...
<body>
    <img src="file/img1.png">
</body>

FileServlet.java

检索图像的Servlet。

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

    private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.
    private String filePath;

     public void init() throws ServletException {
        this.filePath = "/files";
    }

    protected final void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("================In do get==================");

        // Get requested file by path info.
        String requestedFile = request.getPathInfo();
        System.out.println("Requested File: " + requestedFile);

        // Check if file is actually supplied to the request URI.
        if (requestedFile == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        // Decode the file name (might contain spaces and on) and prepare file object.
        File file = new File(filePath, URLDecoder.decode(requestedFile, "UTF-8"));

        System.out.println("Filename: " + file.getName());
        System.out.println(file.getAbsolutePath());

        // Check if file actually exists in filesystem.
        if (!file.exists()) {
            System.out.println("DOES NOT EXIST");
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

    // more code here but it does not matter
    }
}

问题是图像无法加载。在控制台上打印的路径似乎是正确的。我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

对我来说,你的问题就在这里

<img src="file/img1.png">

由于下一个原因,它似乎不是正确的道路:

  1. 根目录为/.../webapps/ROOT/files,因此它应以files而不是file开头。
  2. 该文件的名称应为img +随机长+ .png,此处您将随机长度设置为1并且看起来不正确
  3. 因为它在ROOT webapp中,你应该放一个绝对路径而不是相对路径,换句话说路径应该以斜杠开头