【发布时间】:2012-10-11 13:11:48
【问题描述】:
我正在使用 MEDIUMBLOB 将图像存储在数据库中。当我尝试通过 servlet 加载图像时,我能够看到这些图像。但是,如果图像尺寸很大(1 MB 或更大),我可以在浏览器上看到一半或 3/4 的图像。
当我下载相同的图像并将其放入公共网络内容时,它可以完美运行。知道如何克服这个问题吗?我需要在 servlet 或 MySQL 中设置任何变量吗?
(JSF 生成的)HTML 代码如下:
<img src="DisplayImage?mainID=drawing" />
图像 servlet 执行以下操作:
String imgLen = rs1.getString(1);
int len = imgLen.length();
byte[] rb = new byte[len];
InputStream readImg = rs1.getBinaryStream(1);
InputStream inputStream = readImg;
int index = readImg.read(rb, 0, len);
response.reset();
response.setHeader("Content-Length", String.valueOf(len));
response.setHeader("Content-disposition", "inline;filename=/file.png");
response.setContentType("image/png");
response.getOutputStream().write(rb, 0, len);
response.getOutputStream().flush();
编辑 1
当我使用下面的代码并将文件保存到本地磁盘时,我看到了完整的图像。
String imgLen = rs1.getString(1);
int len = imgLen.length();
rb = new byte[len];
inputStream = rs1.getBinaryStream(1);
while ((read = inputStream.read(rb)) != -1) {
out.write(rb, 0, read);
}
out.flush();
out.close();
编辑 2
当我保存浏览了一半的图像时,我注意到这些 图像的大小为 100KB。我的 1 MB 图像显示大小为 100KB。所有图像都会发生这种情况:(
我认为这是最大的提示出了什么问题。但我不明白出了什么问题。
编辑 3
如果我从web.xml 中删除以下内容,我就可以查看这些图片。
<filter>
<filter-name>MyFacesExtensionsFilter</filter-name>
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
我可以删除那些吗?我不记得为什么我添加了这些...
编辑 4
我的 web.xml 文件是
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
60
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
<filter>
<filter-name>restrict</filter-name>
<filter-class>com.sac.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>restrict</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
<filter>
<filter-name>MyFacesExtensionsFilter</filter-name>
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>DisplayImage</servlet-name>
<servlet-class>com.sac.databean.DisplayImage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayImage</servlet-name>
<url-pattern>/DisplayImage</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SaveMyImage</servlet-name>
<servlet-class>com.sac.databean.SaveMyImage</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SaveMyImage</servlet-name>
<url-pattern>/SaveMyImage</url-pattern>
</servlet-mapping>
</web-app>
【问题讨论】:
-
如何从数据库中检索图像?您是否在使用任何组件库,例如 primefaces?
-
@berkay:使用
getBinaryStream -
@berkay:我更新了问题
-
这与JSF无关。使用纯 HTML
<img>时,您会遇到完全相同的问题。这与DisplayImageURL 后面的内容有关。你需要专注于它的代码。 -
根据您的代码更新,
String#length()返回字符串中的字符数。它真的代表图像的长度吗?
标签: java mysql image jsf servlets