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

Pav*_*vel 10 jsf file-upload glassfish jsf-2.2

我想上传一个图像并将其存储在服务器上,然后用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>
Run Code Online (Sandbox Code Playgroud)

我的豆子

@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());

    }
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 23

我想将它存储在应用程序的"资源/图像"中

不,请不要.WAR部署空间不是永久文件存储位置.每当您重新部署Web应用程序时,所有这些上载的文件都会丢失,原因很简单,因为它们不包含在原始WAR中.有关非常密切相关的问题,请参阅此答案的详细说明:上传的图像仅在刷新页面后可用.


现在,该文件转到"domain1\generated\jsp\FileUpload".

因为您在中指定了相对路径Part#write().它变得相对于您无法控制的当前工作目录.有关详细说明,请参阅此相关答案:getResourceAsStream()vs FileInputStream.您需要指定绝对路径,换句话说,启动路径/.


鉴于您正在使用Glassfish,上传图片中的答案仅在刷新页面后可用,也应该为您完成.简而言之:

  1. 创建一个/var/webapp/images文件夹.请注意,此路径仅供参考,完全免费供您选择.另请注意,当您使用带C:\磁盘的Windows时,此路径相当于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();
    // ...
    
    Run Code Online (Sandbox Code Playgroud)

    (注意:Files#createTempFile()用于自动生成唯一的文件名,否则当新上传的文件(巧合)具有完全相同的文件名时,先前上载的文件将被覆盖)

  3. 告诉GlassFish注册虚拟主机,/var/webapp/images以便http://example.com/images通过添加/WEB-INF/glassfish-web.xmlwebapp 的以下条目来获取所有文件:

    <property name="alternatedocroot_1" value="from=/images/* dir=/var/webapp" />
    
    Run Code Online (Sandbox Code Playgroud)

    (注意:alternatedocroot_1必须完全相同,保持不变,如果你有多个,命名它alternatedocroot_2等;还要注意该/images部分确实不应该包含在dir属性中,这不是拼写错误)

  4. 现在您可以按如下方式显示它:

    <h:graphicImage value="/images/#{bean.imageFileName}" />
    
    Run Code Online (Sandbox Code Playgroud)

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