我如何在java webapp中保存和检索服务器上的图像

时间:2011-12-15 07:14:43

标签: java mysql image tomcat jsf-2

这里有关于图像的另一个问题(这似乎比我初步预测的更难)我正在研究一个带有JSF 2.0(apache myFaces)的java Web应用程序,我希望这个应用程序能够上传图片到它将要运行的服务器上的目标。我有运行mySQL Db的Windows r2 2008服务器,但我不想将数据存储在数据库中,我宁愿将其存储在服务器中的某个位置,然后将该路径保存为数据库中的字符串。

我被告知这是最好的方法,但我似乎无法找到如何将其保存在服务器上的示例。我在Apache tomcat Server上运行应用程序作为WAR文件。所以我不知道是否必须将文件保存到服务器驱动器上的路径(即C:\ images)或项目本身的特殊文件夹(在java,html文件中),任何帮助都非常感谢。我完全迷失了,并且一整天都试图解决这个问题。

我用来将图像上传到java类的代码是这样的(由CodyS提供):

InputStream is = uploadedFile.getInputStream();  
byte[] buffer = new byte[(int) uploadedFile.getSize()];
is.read(buffer); 
File f = new File("C:\\temp\\" + this.patient.getPk() + ".jpeg");   
f.createNewFile();  
FileOutputStream fos = new FileOutputStream(f);  
fos.write(buffer);  //This is where I write it to the C Drive
fos.close();
is.close(); 

而不是将其写入我的C盘我将在服务器上运行它,但是我应该在哪里存储图像以便以后检索并显示在xhtml文件中?我希望我能清楚自己需要什么,如果我不是,请告诉我,我会尝试用其他方式解释。

3 个答案:

答案 0 :(得分:13)

  

而不是将其写入我的C盘我将在服务器上运行它,但是我应该将图像存储到以后的检索并显示在xhtml文件中?

这取决于您对配置服务器的控制程度。理想的是在Tomcat webapps文件夹之外配置固定路径。例如,/var/webapp/upload。您可以将此路径设置为VM参数或环境变量,以便您的webapp可以以编程方式检索它,而无需更改代码。

例如,在指定为VM参数-Dupload.location=/var/webapp/upload时,您可以按如下方式完成上传:

Path folder = Paths.get(System.getProperty("upload.location"));
String filename = FilenameUtils.getBaseName(uploadedFile.getName()); 
String extension = FilenameUtils.getExtension(uploadedFile.getName());
Path file = Files.createTempFile(folder, filename + "-", "." + extension);

try (InputStream input = uploadedFile.getInputStream()) {
    Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING);
}

String uploadedFileName = file.getFileName().toString();
// Now store it in DB.

关于回传文件,最理想的做法是将上传位置作为单独的<Context>添加到Tomcat。 E.g。

<Context docBase="/var/webapp/upload" path="/uploads" />

这样您就可以通过http://example.com/uploads/foo-123456.ext

直接访问它

如果你无法控制配置服务器,那么,存储在数据库中或发送到第三方主机(如Amazon S3)是最好的选择。

另见:

答案 1 :(得分:2)

我会考虑允许用户直接上传到Amazon S3。 Amazon offers a service for that。使用该服务,客户端会将带有文件的表单发布到S3。一旦文件到达那里,亚马逊会将客户端重定向到您的一个端点,以确认数据已经到达,并向您传递相关详细信息。

好处是:

  1. 您的服务器不会花很多时间来接收大文件。您可以将CPU周期花在更有趣的事情上。
  2. 通过将其存储在S3上保证的可用性可能比将其存储在您自己的Windows机器上所获得的更好。
  3. 它缩放。在某些时候,您的文件系统将耗尽空间。 (或者你达到了你可以在文件夹中存储的限制。)

答案 2 :(得分:-3)

我建议您将图像保存在应用程序的WEB-INF文件夹中的子文件夹中。请记住,使用Tomcat时,将自动提取WAR文件。此方法还具有以下优点:您始终可以将应用程序迁移到另一台服务器,只需保存数据库中相对于WEB-INF文件夹的路径。