java - 图像无法在外部 Web 浏览器 (Firefox) 中加载

标签 java html jsp servlets

我已经创建了动态 Web 项目,并且正在使用以下代码上传图像并从同一位置检索。现在,当我尝试在外部浏览器中运行应用程序时,它显示矩形框而不是图像。正在外部 Web 中加载浏览器出现错误。

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.sql.*;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.disk.*;
import org.apache.commons.fileupload.*;

public class UploadImage extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        System.out.println("request: " + request);
        if (!isMultipart) {
            System.out.println("File Not Uploaded");
        } else {
            FileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
            List items = null;

    try 
    {
          items = upload.parseRequest(request);
          System.out.println("items: " + items);
    } 
   catch (FileUploadException e) 
   {
    e.printStackTrace();
   }
        Iterator itr = items.iterator();
        while (itr.hasNext()) {
        FileItem item = (FileItem) itr.next();
        if (item.isFormField())
            {
              String name = item.getFieldName();
              System.out.println("name: " + name);
              String value = item.getString();
              System.out.println("value: " + value);
        }
           else
           {
            try 
                 {
             String itemName = item.getName();
             Random generator = new Random();
             int r = Math.abs(generator.nextInt());
                 String reg = "[.*]";
             String replacingtext = "";
             System.out.println("Text before replacing is:-"+ itemName);
             Pattern pattern = Pattern.compile(reg);
             Matcher matcher = pattern.matcher(itemName);
             StringBuffer buffer = new StringBuffer();
                 while (matcher.find())
                 {
             matcher.appendReplacement(buffer, replacingtext);
             }
             int IndexOf = itemName.indexOf(".");
             String domainName = itemName.substring(IndexOf);
             System.out.println("domainName: " + domainName);
                 String finalimage = buffer.toString() + "_" + r+ domainName;
             System.out.println("Final Image===" + finalimage);
        File savedFile = new File("D:\\test1\\" + "images\\"+ finalimage);
             item.write(savedFile);
        out.println("<html>");
        out.println("<body>");
            out.println("<table><tr><td>");
            out.println("<img src=D:\\test1\\images\\" + finalimage+ ">");
        out.println("</td></tr></table>");
            Connection conn = null;
            String url = "jdbc:oracle:thin:@//localhost:1521/erp";
            String username = "system";
            String userPassword = "manager";
        String strQuery = null;
        try 
            {
        System.out.println("itemName::::: " + itemName);
        Class.forName("oracle.jdbc.driver.OracleDriver");
        conn = DriverManager.getConnection(url, username,userPassword);
        Statement st = conn.createStatement();
        strQuery = "insert into testimage values('"+ finalimage + "')";
            int rs = st.executeUpdate(strQuery);
        System.out.println("Query Executed Successfully++++++++++++++");
            out.println("image inserted successfully");
        out.println("</body>");
            out.println("</html>");
        }
            catch (Exception e)
            {
        System.out.println(e.getMessage());
        } 
            finally
            {
        conn.close();
        }
        } 
           catch (Exception e)
           {
        e.printStackTrace();
            }
                }
            }
        }
    }
}

最佳答案

流程大致如下:

  • 最终用户请求特定网址上的网页。
  • 网络浏览器向给定 URL 上的网络服务器发送 HTTP 请求。
  • 网络服务器检索 HTTP 请求并返回所需的网页作为 HTTP 响应。
  • 网络浏览器以 HTML 代码的形式检索 HTTP 响应。
  • Webbrowser 解析 HTML 代码以呈现它并遇到 <img>元素。
  • 网络浏览器尝试从 src 中指定的位置下载图像。属性。

它也有失败的地方。您指定了一个固定的本地磁盘文件系统路径,仅当 Web 浏览器与 Web 服务器在物理上运行在同一台计算机上时才有效(这会发生在开发环境中,但绝对不会在生产环境中发生)。您不能也不应该期望最终用户在其本地磁盘文件系统的给定位置处拥有所需的镜像。更重要的是,您不能也不应该期望最终用户拥有 D:磁盘,更不用说最终用户也运行 Windows。

您应该在图像的 src 中指定一个完整的 URL属性。正是您在网络浏览器地址栏中输入的地址以查看图像,以 http:// 开头。或https://方案。

有多种方法可以实现此目的,最流行的两种方法是:

  1. 将上传文件夹公开为虚拟主机。这是在服务器配置中完成的。您没有告诉您正在使用哪一个,但我们假设它是 Tomcat,就像许多初学者会使用的那样: open /conf/server.xml文件并将以下元素添加到 <Host>元素:

    <Context docBase="D:\test1\images" path="/images" />
    

    docBase指定所有文件所在的根文件夹,path指定您将在 URL 中的域部分之后看到的上下文路径。这样,就可以通过 http://example.com/images/... 访问图像。 .

    out.println("<img src=\"/images/" + finalimage+ "\">");
    

  2. 创建一个简单的 servlet,它从磁盘读取图像,并在设置所需的响应 header 后将其写入响应,告诉浏览器文件内容类型、长度和配置,以便浏览器知道如何处理它:

    @WebServlet("/images/*")
    public class ImageServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String filename = URLDecoder.decode(request.getPathInfo(), "UTF-8");
            File file = new File("D:\\test1\\images", filename);
            response.setHeader("Content-Type", getServletContext().getMimeType(file.getName()));
            response.setHeader("Content-Length", String.valueOf(file.length()));
            response.setHeader("Content-Disposition", "inline; filename=\"" + file.getName() + "\"");
            Files.copy(file.toPath(), response.getOutputStream());
        }
    
    }
    

    这样,图像就可以通过 http://example.com/images/... 访问。 .

    out.println("<img src=\"/images/" + finalimage+ "\">");
    
<小时/>

与具体问题无关,在 servlet 中发出 HTML 是一种非常糟糕的做法。为此,您应该使用 JSP。另请参阅 our servlets wiki page编码风格和建议部分.

您是否进一步考虑过上传的图像恰好与现有上传的图像具有相同的文件名?

关于java - 图像无法在外部 Web 浏览器 (Firefox) 中加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16119087/

相关文章:

java - Akka 流 GraphStage

java - 将映射键与某些元素进行比较,并根据结果显示其值

java - 在 JSP 上使用 jSTL setBundle 从 jar 读取属性文件

java - 为所有子组件设置属性

java - 这段代码的时间问题

java - ThreadLocal 的使用如何降低可重用性

javascript - 使用 JavaScript 对 HTML 中的 Python/Flask 动态呈现的表进行排序

javascript - 修改 jquery 幻灯片代码以自动播放

html - 覆盖 1 个 div 但不会扭曲网站或不安排网站

java - JSP中的表达式语言: Arithmetic Operator Division