我正在使用struts2框架进行开发。用户可以从我们的网页下载图像。以下代码已经完成,但我对以下代码有一些疑问。
<result name="success" type="stream">
<param name="contentType">image/tiff</param>
<param name="inputName">fileInputStream</param>
<param name="contentDisposition">filename="test.tif"</param>
<param name="bufferSize">20480</param>
</result>
当用户请求图像时,系统会读取物理文件并将其传递给fileinputstream。
File f = new File("C:/test.tif");
fileInputStream = new FileInputStream(f);
但是,如果一个或多个用户同时请求相同的图像,那么上述代码是否会出现问题?如果是,我如何编辑代码以避免并发问题?
由于
答案 0 :(得分:0)
Struts2操作是ThreadSafe 。
它们是ThreadLocal
,每个Action都有自己的变量实例。
如果三个用户调用该代码,则将创建三个FileInputStream。
要将文件加载到内存中,您可以从fileInputStream
读取并写入ByteArrayOutputStream
(read more),但为什么您要阅读内存中的所有文件然后将其传递给客户端?使用inputStream将 stream 传递给客户端是无用且昂贵的。如果设置了content-length,浏览器也会绘制进度条:|
假设您有private InputStream fileInputStream;
和相关的Getter
,您的代码只缺少返回值:
File f = new File("C:/test.tif");
fileInputStream = new FileInputStream(f);
return SUCCESS;
由于java.io.File
表示文件系统中的文件而不是打开文件,因此您是安全的(下载完成后输入流将自动关闭)