外部WebBrowser(Firefox)中无法加载图像

时间:2013-04-20 10:08:52

标签: java html jsp servlets

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

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

1 个答案:

答案 0 :(得分:1)

这个过程大致如下:

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

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

您应该在图片的src属性中指定一个值得信赖的网址。正好是您在webbrowser的地址栏中输入的那个,以便查看图像,从http://https://方案开始。

有几种方法可以达到这个目的,最常用的两种方法是:

  1. 将上传文件夹公开为虚拟主机。这将在服务器配置中完成。你没有告诉你正在使用哪一个,但让我们假设Tomcat像许多初学者一样使用:打开/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,它从磁盘读取图像并在设置了所需的响应标题后将其写入响应,告诉浏览器文件内容类型,长度和处置,以便浏览器知道如何处理它:

    @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+ "\">");
    

  3. 不相关到具体问题,在servlet中发出HTML是一种非常糟糕的做法。你应该使用JSP。另请参阅our servlets wiki page编码样式和建议部分。

    您是否还考虑过上传过的图像与现有的上传图片具有相同的文件名?