这是有关图像的另一个问题(似乎比我最初预计的要困难得多),我正在使用JSF 2.0(apache myFaces)开发Java Web应用程序,我希望该应用程序能够将图片上传到目标位置将要在其上运行的服务器。我有一台运行mySQL Db的Windows r2 2008 Server,但是我不想将映像存储在数据库中,而是将其存储在服务器中的某个位置,然后将路径另存为字符串在数据库中。
有人告诉我这是最好的方法,但是我似乎找不到如何将其保存在服务器上的示例。我在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文件中?我希望我对自己的需求很清楚,如果我不需要,请告诉我,我将尝试用另一种方式进行解释。
而不是将其写入C驱动器,而是要在服务器上运行它,但是应将图像存储在哪里以供以后检索并显示在xhtml文件中?
这取决于您对服务器的配置有多少控制权。理想的做法是在Tomcat webapps文件夹外部配置固定路径。例如,/var/webapp/upload。您可以将此路径设置为VM参数或环境变量,以便您的webapp可以以编程方式检索它,而无需更改代码。
/var/webapp/upload
例如,当指定为VM参数时-Dupload.location=/var/webapp/upload,您可以按照以下步骤完成上传:
-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>
<Context docBase="/var/webapp/upload" path="/uploads" />
这样,您可以通过http://example.com/uploads/foo-123456.ext直接访问它
如果您对配置服务器没有任何控制权,那么最好将其存储在数据库中或发送给第三方主机(例如Amazon S3)。