Java 如何从jsp显示本地路径中的图像

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23458549/
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 23:07:43  来源:igfitidea点击:

How to display image from local path from jsp

javahtmlimagejspservlets

提问by user3599482

I am trying to display an image throw jsp. Image is stored in local path so I wrote a servlet get method to retrive image and in src attribute of image tag I am giving the servlet name and image path as parameter to servlet and here is my code,

我想显示一个图像抛出jsp。图像存储在本地路径中,因此我编写了一个 servlet get 方法来检索图像,并在图像标记的 src 属性中将 servlet 名称和图像路径作为参数提供给 servlet,这是我的代码,

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

    // Check if file is actually supplied to the request URI.
    if (requestedFile == null) {
        // Do your thing if the file is not supplied to the request URI.
        // Throw an exception, or send 404, or show default/warning page, 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 file = new File(filePath, URLDecoder.decode(requestedFile, "UTF-8"));

    // Check if file actually exists in filesystem.
    if (!file.exists()) {
        // Do your thing if the file appears to be non-existing.
        // Throw an exception, or send 404, or show default/warning page, or just ignore it.
        response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
        return;
    }

    // Get content type by filename.
    String contentType = getServletContext().getMimeType(file.getName());

    // If content type is unknown, then set the default value.
    // For all content types, see: http://www.w3schools.com/media/media_mimeref.asp
    // To add new content types, add new mime-mapping entry in web.xml.
    if (contentType == null) {
        contentType = "application/octet-stream";
    }

    // Init servlet response.
    response.reset();
    response.setBufferSize(DEFAULT_BUFFER_SIZE);
    response.setContentType(contentType);
    response.setHeader("Content-Length", String.valueOf(file.length()));
    response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");

    // Prepare streams.
    BufferedInputStream input = null;
    BufferedOutputStream output = null;

    try {
        // Open streams.
        input = new BufferedInputStream(new FileInputStream(file), 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);
    }
}

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

}


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

in web.xml the servlet entry is as follow,

在 web.xml servlet 条目如下,

<servlet>
<description>
</description>
<display-name>FileServlet</display-name>
<servlet-name>FileServlet</servlet-name>
<servlet-class>com.mypackage.FileServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>FileServlet</servlet-name>
<url-pattern>/file/*</url-pattern>
</servlet-mapping>

In Jsp I have img tag as follow,

在 Jsp 中,我有如下的 img 标签,

<img alt="Image" src="file/D:/uploads/img14.jsp" width="160" height="160"    class="img-thumbnail">

I think I made mistake in src attribute of img tag can anyone tell wht is the mistake I made here .

我想我在 img 标签的 src 属性中犯了错误,谁能告诉我我在这里犯了什么错误。

采纳答案by Luiggi Mendoza

Looks like you have misunderstood BalusC's post about this: FileServlet. In this case, you will have a base path in your disk to server your files (external to the web application folder path in server), and then the path used in your URL will be used to search insidethis base path. Note from BalusC's example how to call the resources:

看起来你误解了 BalusC 关于这个的帖子:FileServlet。在这种情况下,您的磁盘中将有一个基本路径来为您的文件提供服务器(在服务器中的 Web 应用程序文件夹路径之外),然后您的 URL 中使用的路径将用于此基本路径进行搜索。请注意 BalusC 的示例如何调用资源:

<a href="file/foo.exe">download foo.exe</a>

Where:

在哪里:

  • fileis the URL pattern for your Servlet. Noted in your web.xml configuration:

    <servlet-mapping>
    <servlet-name>FileServlet</servlet-name>
    <url-pattern>/file/*</url-pattern>
    </servlet-mapping>
    
  • The rest of the URL /foo.exeis the location of the file in your server hard drive. This can be easily obtained by usage of HttpServletRequest.html#getPathInfo

  • file是 Servlet 的 URL 模式。在您的 web.xml 配置中注明:

    <servlet-mapping>
    <servlet-name>FileServlet</servlet-name>
    <url-pattern>/file/*</url-pattern>
    </servlet-mapping>
    
  • URL /foo.exe的其余部分是文件在服务器硬盘驱动器中的位置。这可以通过使用HttpServletRequest.html#getPathInfo

This is noted by this part of the code (comments are mine):

这部分代码注意到了这一点(评论是我的):

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

protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    // Get the file path from the URL.
    String requestedFile = request.getPathInfo();

    //...
    //using filePath attribute in servletclass as the base path
    //to lookup for the files, using the requestedFile
    //path to seek for the existance of the file (by name)
    //in your server
    //decoding the name in case of GET request encoding such as
    //%2F => /
    File file = new File(filePath, URLDecoder.decode(requestedFile, "UTF-8"));
    //...
}

Then, when having a request like this (in HTML code in your view):

然后,当有这样的请求时(在你的视图中的 HTML 代码中):

<img src="files/img/myimage.png" />

You have to make sure the file exists in your server:

您必须确保该文件存在于您的服务器中:

- /  <-- root
  - /files <-- this is the base file path set in init method in your servlet
    - /img
      - myimage.png

More info:

更多信息:

回答by Traveling Tech Guy

The mistake you made is trying to call your JSP page as an image resource. The JSP itself is just a text file. You need to substitute the path to the file with a url to the page on a server that will compile/serve the results of the JSP page, namely the image. If it's on a local server, typically the url will look like http://localhost:<port>/.../img14.jsp.

您犯的错误是试图将您的 JSP 页面称为图像资源。JSP 本身只是一个文本文件。您需要使用指向将编译/提供 JSP 页面结果(即图像)的服务器上的页面的 url 替换文件路径。如果它在本地服务器上,通常 url 看起来像http://localhost:<port>/.../img14.jsp.

回答by kumaravel10

I have tried below code and it works fine in both servlet and java. If the image is converted as byte in servlet using the code below then set the converted byte code in session attribute and get it jsp.

我已经尝试过下面的代码,它在 servlet 和 java 中都可以正常工作。如果使用下面的代码在 servlet 中将图像转换为字节,则在 session 属性中设置转换后的字节码并获取 jsp。

Note: it can display any format of image

注意:它可以显示任何格式的图像

package Jx_Test;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import org.apache.commons.codec.binary.Base64;

public class Imag {

    public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {
        // TODO Auto-generated method stub
         File file = new File("C:\Users\Public\Pictures\Sample Pictures\Desert.jpg");

            FileInputStream fis = new FileInputStream(file);
            //create FileInputStream which obtains input bytes from a file in a file system
            //FileInputStream is meant for reading streams of raw bytes such as image data. For reading streams of characters, consider using FileReader.

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            try {
                for (int readNum; (readNum = fis.read(buf)) != -1;) {
                    //Writes to this byte array output stream
                    bos.write(buf, 0, readNum); 
                    System.out.println("read " + readNum + " bytes,");
                }
            } catch (IOException ex) {
               // Logger.getLogger(ConvertImage.class.getName()).log(Level.SEVERE, null, ex);
            }

            byte[] bytes = bos.toByteArray();

            byte[] encodeBase64 = Base64.encodeBase64(bytes);
            String base64Encoded = new String(encodeBase64, "UTF-8");


            System.out.println(base64Encoded);
    }

}

//Jsp
<img src="data:image/jpeg;base64,<%=base64Encoded%>"/>

回答by Rubi Verma

Your src attribute of img tag should be like this to send request to your servlet. src="${pageContext.request.contextPath}/FileServlet/getImage?path=D:\offline_registration\11022017\unzip\a89a89e9-5de2-4bb2-9225-e465bb5705b1.jpeg"

你的 img 标签的 src 属性应该是这样的,以向你的 servlet 发送请求。src="${pageContext.request.contextPath}/FileServlet/getImage?path=D:\offline_registration\11022017\unzip\a89a89e9-5de2-4bb2-9225-e465bb5705b1.jpeg"

here path variable contains path of image from local system.

这里路径变量包含来自本地系统的图像路径。