如何保存和检索我的服务器上的图像在一个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到你的端点之一,以确认数据已经到达,通过你的相关细节。
好处是:
- 您的服务器不会花费很多时间来接收大文件。 你可以把你的CPU周期放在一些有趣的事情上。
- 通过将其存储在S3上来保证可用性可能会比通过将其存储在自己的Windows机器上所获得的更好。
- 它规模。 在某个时候,你的文件系统将会耗尽空间。 (或者你达到了你可以存储在一个文件夹内的限制。)
我build议您将图像保存在应用程序的WEB-INF文件夹中的子文件夹中。 请记住,当您使用Tomcat时,您的WAR文件将被自动提取。 这种方法还具有可以将应用程序迁移到另一台服务器的优势,只需要在数据库中保存相对于WEB-INF文件夹的path即可。