Java 从数据库提供文件时指定内容长度

Java 从数据库提供文件时指定内容长度,java,tomcat,servlets,Java,Tomcat,Servlets,在servlet中,我希望从数据库中读取EML,并使用“下载文件”UI将其提供给客户机。当我指定内容长度标题时,下载需要几分钟时间才能开始。当我不这样做时,一切正常,但我确实想设置标题:)我缺少什么 // part is javax.mail.Part response.setHeader("Content-Disposition", "attachment" + filename); response.setContentType(mime); response.setContentLengt

在servlet中,我希望从数据库中读取EML,并使用“下载文件”UI将其提供给客户机。当我指定
内容长度
标题时,下载需要几分钟时间才能开始。当我不这样做时,一切正常,但我确实想设置标题:)我缺少什么

// part is javax.mail.Part
response.setHeader("Content-Disposition", "attachment" + filename);
response.setContentType(mime);
response.setContentLength(part.getSize()); // This line causes the problem
IOUtils.copy(part.getInputStream(), out);

只是一个猜测-也许文件必须从数据库中提取才能得到它的大小?保存大小以分隔列,并从中提供值。通过java.sql.Blob处理数据库中的文件也应该可以


不幸的是,在您的示例中没有获取零件对象的位置信息。

为什么要设置内容长度标题?HTTP/1.1客户端不需要这个字段(这只是一个问题:)此外,我不知道这个字段是否真的是可选的@Mark:这不是必需的,但这对用户来说是很好的,这样他们就可以看到有多少下载已经完成,还有多少剩余。如果没有内容长度标题,浏览器将无法获取信息并显示它。我将整个EML存储在数据库中。在运行时,我重构一个mimessage并将请求的部分写入servlet responseh该部分有多大?您是否希望花费几分钟的时间来检索整个文档?除了一些占3-400KB的pdf之外,这些部分通常只有几个字节。如果没有内容长度,下载很快就会完成(因为我正在本地主机上测试),所以问题似乎就出在这个值上。从javadoc的一部分来看,getSize()被设计为返回一个估计值,而不是一个精确的大小,所以在我看来这更像是一个浏览器故障,但它会影响所有浏览器……Part.getSize()返回一个粗略的估计值。在这种情况下,估计值大于实际大小,这导致浏览器等待额外的时间,然后才意识到实际上没有更多的内容要传输