how to display image which is outside server directory in strtus

后端 未结 2 844
既然无缘
既然无缘 2020-12-20 07:32

This question is continuation to my previous question Accessing External Files Into Our Web Application, actually I am uploading file using struts tag

2条回答
  •  忘掉有多难
    2020-12-20 07:47

    Hi Below is the answer to my question, I have created ImageServlet for displaying image, steps to perform:

    1. you need to add mapping in web.xml file:

        ImageServlet
        /ImageServlet/*
    

    2. create ImageServlet:

    public class ImageServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
        {
    
            //Setting image path
            ImageLocationService locationService = new ImageLocationService();
    
            try {
                String imageCategory = request.getParameter("imageCategory");
                if (imageCategory != null) {
                    this.imagePath = locationService.getImageLocation(imageCategory);
                }else{
                    this.imagePath = ConfigConstants.imageLocation;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            // Get requested image by path info.
            String requestedImage = request.getPathInfo();
    
            // Check if file name is actually supplied to the request URI.
            if (requestedImage == null) {
                // Do your thing if the image is not supplied to the request URI.
                // Throw an exception, or send 404, or show default/warning image, or just ignore it.
                response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
                return;
            }
    
            // Decode the file name (might contain spaces and on) and prepare file object.
            File image = new File(imagePath, URLDecoder.decode(requestedImage, "UTF-8"));
    
            // Check if file actually exists in filesystem.
            if (!image.exists()) {
                // Do your thing if the file appears to be non-existing.
                // Throw an exception, or send 404, or show default/warning image, or just ignore it.
                response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
                return;
            }
    
            // Get content type by filename.
            String contentType = getServletContext().getMimeType(image.getName());
    
            // Check if file is actually an image (avoid download of other files by hackers!).
            // For all content types, see: http://www.w3schools.com/media/media_mimeref.asp
            if (contentType == null || !contentType.startsWith("image")) {
                // Do your thing if the file appears not being a real image.
                // Throw an exception, or send 404, or show default/warning image, or just ignore it.
                response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
                return;
            }
    
            // Init servlet response.
            response.reset();
            response.setBufferSize(DEFAULT_BUFFER_SIZE);
            response.setContentType(contentType);
            response.setHeader("Content-Length", String.valueOf(image.length()));
            response.setHeader("Content-Disposition", "inline; filename=\"" + image.getName() + "\"");
    
            // Prepare streams.
            BufferedInputStream input = null;
            BufferedOutputStream output = null;
    
            try {
                // Open streams.
                input = new BufferedInputStream(new FileInputStream(image), DEFAULT_BUFFER_SIZE);
                output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);
    
                // Write file contents to response.
                byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
                int length;
                while ((length = input.read(buffer)) > 0) {
                    output.write(buffer, 0, length);
                }
            } finally {
                // Gently close streams.
                close(output);
                close(input);
            }
        }
    
        private static void close(Closeable resource) {
            if (resource != null) {
                try {
                    resource.close();
                } catch (IOException e) {
                    // Do your thing with the exception. Print it, log it or mail it.
                    e.printStackTrace();
                }
            }
        }
    }
    

    3. At jsp side you need to add the mapping in step 1 in your img tag i.e. input type='image':

    
    

    You can even create Action class and use execute method for doing the same.

提交回复
热议问题