如何保存和检索我的服务器上的图像在一个Java Web应用程序

在这里与图像的另一个问题(这似乎是比我最初预测更困难)我正在与JSF 2.0(Apache myFaces)的Java Web应用程序,我希望这个应用程序能够上传图片到目的地它将运行的服务器。 我有一台运行mySQL Db的Windows r2 2008服务器,但是我不想将图像存储在数据库中,我宁愿将其存储在服务器的某个位置,然后将path保存为数据库中的string。

我被告知这是最好的方法,但我似乎无法find如何将其保存在服务器上的示例。 我在Apache Tomcat服务器上运行该应用程序作为WAR文件。 所以我不知道是否必须将文件保存到服务器驱动器上的path(即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文件中? 我希望我清楚自己需要什么,让我知道如果我不是,我会试着用另一种方式来解释。

而不是写到我的C驱动器,我要在服务器上运行它,但我应该在哪里存储图像以便稍后检索并显示在xhtml文件中?

这取决于您对configuration服务器有多less控制权。 理想的做法是在Tomcat的webapps文件夹之外configuration一个固定的path。 例如, /var/webapp/upload 。 您可以将此path设置为VM参数或环境variables,以便您的Web应用程序可以以编程方式检索它,而无需更改代码。

例如,当指定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。 例如

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

这样,您可以通过http://example.com/uploads/foo-123456.ext直接访问它;

如果您对configuration服务器没有任何控制权,那么,存储在数据库中或发送给第三方主机(如Amazon S3)是最佳select。

也可以看看:

  • 如何在File类中提供相对path来上传任何文件?
  • 可靠的数据服务

我会考虑允许用户直接上传到Amazon S3。 亚马逊为此提供服务 。 使用该服务,客户端会将文件直接发送到S3。 一旦文件到达那里,亚马逊将把客户端redirect到你的端点之一,以确认数据已经到达,通过你的相关细节。

好处是:

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

我build议您将图像保存在应用程序的WEB-INF文件夹中的子文件夹中。 请记住,当您使用Tomcat时,您的WAR文件将被自动提取。 这种方法还具有可以将应用程序迁移到另一台服务器的优势,只需要在数据库中保存相对于WEB-INF文件夹的path即可。