2012-08-03 32 views
3

我正在处理显示需要通过(JSF)文件上传更新的pdf文件的网页。我的问题是,我怎样才能设置我的网页,以便这个新上传的文件实际上取代了旧文件?从网页访问服务器上的文件

我有文件上传工作,以便管理员用户可以上传不同的pdf文件来替换当前显示的文件,将pdf发送到我的tomcat服务器中的文件夹,使用与先前显示的文件名相同的文件名。我这样做是因为我知道您不能将PDF保存到Web应用程序中的资源文件,因为这些文件在应用程序运行时不会被动态加载。我使用以下HTML来显示PDF格式:

<object id="pdf" data="uploads/folder/replaceable.pdf" type="application/pdf" width="100%" height="100%"> 
     <p>It appears you don't have a PDF plugin for this browser. 
     No biggie... you can <a hRef="uploads/folder/replaceable.pdf" onClick="updatePDF();">click here to 
     download the PDF file.</a></p> 
</object> 

我见过Uploaded image only available after refreshing the pageHow I save and retrieve an image on my server in a java webapp看到,这可以用<Context>标签来检索文件来完成类似我怎么也data="uploads/folder/replaceable.pdf",但我不” t知道关于<Context>标记的任何内容,并且一直没有能够得到这个工作

+0

你可以发布一些关于你如何上传文件? – 2012-08-27 20:56:25

回答

0

我认为你遇到的问题是浏览器正在缓存PDF文件,并且即使服务器上有新文件,浏览器也不会提取它。为了强制浏览器获取最新版本的PDF文件,您需要在非常短的时间内将HTTP响应中的过期标头设置。有关在Tomcat中设置的更多信息,请参阅here。我相信这是Tomcat 7以来的一项功能。对于以前版本的Tomcat,您需要推出自己的Servlet,修改响应标头,您可以通过一些Google搜索轻松找到它。

要查看实际的HTTP响应标题,您可以使用内置于Chrome或Firefox中的Firebug的开发者工具。

这里的web.xml中的相关条目,你将需要:

<!-- EXPIRES FILTER --> 
<filter> 
    <filter-name>ExpiresFilter</filter-name> 
    <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class> 
    <init-param> 
     <param-name>ExpiresByType application/pdf</param-name> 
     <param-value>access plus 1 minutes</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>ExpiresFilter</filter-name> 
    <url-pattern>uploads/folder/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 
0

不知道这是否会工作,但我做了一个异步上传脚本使用JQuery和Ajax,更新图像上的运行页。这可能也适用于您的方案。

的基本原理是:创建jQuery和Blueimp上传库上载脚本:http://blueimp.github.com/jQuery-File-Upload/

点上传到一个Servlet,JSP页面或者这样处理上载。此页面将存储该文件以及需要的内容,然后提供带有JSON或XML数据的回调回到发送上传的页面,其中包括存储文件的文件名。然后使用JQuery在JSF页面上更新对象的内容。

请注意,每次上传文件名都应该改变;否则,浏览器可能会尝试从缓存中获取旧的PDF文件,并且没有任何更改。在写这篇文章时,我无法弄清楚如何解决这个问题,因此您可能需要对此进行更多的研究。

为了您的方便,我还写了一个关于它的blog post,可能对您有所帮助。