0

我创建了动态 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();
            }
                }
            }
        }
    }
}
4

1 回答 1

1

流程大致如下:

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

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

相反,您应该在图像的src属性中指定一个完整的 URL。与您在 webbrowser 的地址栏中输入以查看图像的方式完全相同,以http://orhttps://方案开头。

有几种方法可以实现这一点,两种最流行的方法是:

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

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

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

于 2013-04-20T12:21:01.597 回答