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

标签 java mysql image tomcat jsf-2

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

有人告诉我这是最好的方法,但我似乎找不到有关如何将其保存在服务器上的示例。我在 Apache tomcat 服务器上将应用程序作为 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 文件中?我希望我清楚我需要什么,如果我不清楚,请告诉我,我会尝试用另一种方式解释。

最佳答案

instead of writing it to my C drive I'm going to run it on the server, but where should I store the image to later retriev and display in an xhtml file?

这取决于您对配置服务器的控制程度。理想的做法是在 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。例如

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

这样就可以直接通过http://example.com/uploads/foo-123456.ext访问了

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

另见:

关于java - 如何在 java webapp 中的服务器上保存和检索图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8516387/

相关文章:

java - 无法通过谢尔宾斯基三角形的递归

java - protobuf-net 序列化/反序列化 DateTime 和 Guid 类型

java - 媒体播放器错误

mysql - 如何在查询中使用参数

mysql - SQL 中可以有 "null rows"吗?

java - 确保在Java中保留List中的顺序并提高效率

html - 无法将文字放在图像上

java - 用Java填充二维数组

php - 当用户编辑他们的个人资料时,如何避免图像被覆盖为空白?

Python MySQL 错误 1064 插入日期时间字符串