Как записать файл в папку ресурса / изображения приложения?

Я хотел бы загрузить изображение и сохранить его на сервере, а затем показать его с помощью h:graphicImage? Я хотел бы сохранить его в "ресурсах / изображениях" приложения. Я использую Glassfish 4. Прямо сейчас файл переходит в "domain1\generate \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());

    }
}

2 ответа

Решение

Я хотел бы сохранить его в "ресурсах / изображениях" приложения

Нет, пожалуйста, не надо. Область развертывания WAR не предназначена для постоянного хранения файлов. Все эти загруженные файлы будут потеряны при повторном развертывании веб-приложения по той простой причине, что они не содержатся в исходной WAR. Более подробное объяснение см. Также в этом ответе на очень тесно связанный вопрос: загруженное изображение доступно только после обновления страницы.


Прямо сейчас файл переходит в "domain1\generate \jsp\FileUpload".

Поскольку вы указали относительный путь в Part#write(), Это становится относительно текущего рабочего каталога, который вы не можете контролировать. См. Для подробного объяснения также этот связанный ответ: getResourceAsStream () vs FileInputStream. Вам необходимо указать абсолютный путь, другими словами, начать путь с /,


Учитывая, что вы используете Glassfish, ответ в загруженном изображении, доступном только после обновления страницы, также должен сделать это для вас. В двух словах:

  1. Создать /var/webapp/images папка. Обратите внимание, что этот путь только примерный и полностью свободный по вашему выбору. Также обратите внимание, что когда вы используете Windows с C:\ диск, то этот путь эквивалентен 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. Скажите GlassFish, чтобы зарегистрировать виртуальный хост на /var/webapp/images так что все файлы доступны на http://example.com/images добавив следующую запись в /WEB-INF/glassfish-web.xml веб-приложения:

    <property name="alternatedocroot_1" value="from=/images/* dir=/var/webapp" />
    

    (нота: alternatedocroot_1 должно быть точно так, оставьте его неизменным, если у вас есть несколько, назовите его alternatedocroot_2 , так далее; Также обратите внимание, что /images часть действительно не должна быть включена в dir атрибут, это не опечатка)

  4. Теперь вы можете отобразить это следующим образом:

    <h:graphicImage value="/images/#{bean.imageFileName}" />
    

    (примечание: использовать value атрибут, а не name атрибут)

Не смог заставить его работать с Path#write в стеклянной рыбе, поэтому я использовал Path#getInputStream следующее:

public void upload(){
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            String filename = getFilename(uploadedFile);
            File file = new File("/var/webapp/images/"+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;
    }
Другие вопросы по тегам