Как записать файл в папку ресурса / изображения приложения?
Я хотел бы загрузить изображение и сохранить его на сервере, а затем показать его с помощью 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, ответ в загруженном изображении, доступном только после обновления страницы, также должен сделать это для вас. В двух словах:
Создать
/var/webapp/images
папка. Обратите внимание, что этот путь только примерный и полностью свободный по вашему выбору. Также обратите внимание, что когда вы используете Windows сC:\
диск, то этот путь эквивалентенC:\var\webapp\images
,Сохраните загруженный файл там.
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()
используется для автоматической генерации уникального имени файла, в противном случае ранее загруженный файл будет перезаписан, когда новый загруженный файл (по совпадению) будет иметь точно такое же имя файла)Скажите 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
атрибут, это не опечатка)Теперь вы можете отобразить это следующим образом:
<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;
}