Как сохранить и получить изображение на моем сервере в java webapp

Здесь с другим вопросом о Изображениях (который кажется более сложным, чем я предсказывал) Я работаю над Java-приложением с JSF 2.0 (apache myFaces), и я хочу, чтобы это приложение могло загружать картинку в пункт назначения на сервере, на котором он будет работать. У меня есть сервер Windows r2 2008, на котором работает mySQL Db, но я не хочу хранить изображение в db, я бы скорее сохранил его где-то на сервере, а затем просто сохранил путь в виде строки в db.

Мне сказали, что это лучший способ, но я не могу найти пример того, как сохранить его на сервере. Я запускаю приложение на сервере 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? Я надеюсь, что я буду разбираться в том, что мне нужно, дайте мне знать, если я не буду, и я попытаюсь объяснить по-другому.

Ответ 1

вместо того, чтобы записывать его на мой диск C, я собираюсь запустить его на сервере, но где я должен хранить изображение для последующего поиска и отображения в файле xhtml?

Это зависит от того, сколько у вас контроля над настройкой сервера. Идеально было бы настроить фиксированный путь вне папки Tomcat Webapps. Например, /var/webapp/upload. Вы можете установить этот путь как аргумент виртуальной машины или переменную среды, чтобы ваш webapp мог получить ее программно без необходимости изменения кода.

Например, при указании в качестве аргумента VM -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 docBase="/var/webapp/upload" path="/uploads" />

Таким образом вы можете получить к нему доступ непосредственно http://example.com/uploads/foo-123456.ext

Если у вас есть нулевой контроль над настройкой сервера, то, наилучшим образом, хранение в БД или отправка на сторонний хост, такой как Amazon S3, - ваш лучший выбор.

См. также:

Ответ 2

Я бы подумал о том, чтобы позволить пользователю загружать на Amazon S3 напрямую. Amazon предлагает услугу для этого. Используя эту услугу, клиент отправит форму с файлом непосредственно на S3. После того, как файл поступит туда, Amazon перенаправит клиента на одну из ваших конечных точек, чтобы подтвердить, что данные прибыли, передав вам соответствующие данные.

Преимущества:

  • Ваш сервер не тратит много времени на получение огромных файлов. Вы можете потратить свои циклы процессора на что-то более интересное.
  • Доступность, гарантированная сохранением ее на S3, вероятно, лучше, чем вы могли бы получить, сохранив ее в своем собственном окне Windows.
  • Он масштабируется. В какой-то момент ваша файловая система закончится. (Или вы достигнете предела того, что вы можете сохранить в папке.)

Ответ 3

Я предлагаю вам сохранить ваши изображения в подпапке, находящейся в папке WEB-INF вашего приложения. Помните, что при использовании Tomcat ваши файлы WAR будут автоматически извлечены. Этот подход также имеет то преимущество, что вы всегда можете перенести приложение на другой сервер, вам нужно сохранить путь к папке WEB-INF в вашей базе данных.