Предполагается, что аннотация @javax.servlet.annotation.MultipartConfig
должна быть размещена в классе, реализующем HttpServlet
, а не в классе поддерживающего компонента. По сути, эта аннотация должна быть помещена в класс FacesServlet
, что уже сделано, начиная с JSF 2.2.
Другими словами, аннотация @MultipartConfig
в вашем классе поддерживающего компонента игнорируется и не имеет никакого эффекта, и файл фактически не сохраняется в location
, указанном вами в аннотации. Вместо этого он был сохранен в пути относительно так называемого текущего рабочего каталога, который фактически является "открытой в данный момент папкой" в момент выполнения java.exe
. В случае веб-приложений Java это обычно двоичная папка сервера или около того. Вы можете отследить его, как показано ниже:
System.out.println(new File(".").getAbsolutePath());
Там вы увидите загруженный файл.
Более того, даже если аннотация @MultipartConfig
работала, атрибут location
на самом деле не представляет собой постоянное место сохранения загрузки файла. Вместо этого он представляет собой временное место хранения на диске на тот случай, если размер загружаемого файла превышает доступный/настроенный объем памяти. Вы никогда не должны постоянно хранить загруженные файлы в месте, указанном @MultipartConfig(location)
. Вы всегда должны получать содержимое файла через Part#getInputStream()
и записывать его в нужное постоянное место, указанное новым File
или Path
, представляющим абсолютный путь.
Избавьтесь от всей этой аннотации @MultipartConfig
. Он не делает ничего полезного в классе поддерживающего компонента. Просто получите содержимое файла с помощью Part#getInputStream()
и скопируйте его по нужному абсолютному пути:
try (InputStream input = imagemCarregada.getInputStream()) {
Files.copy(input, new File("/home/rogerio/tmp/teste.jpg").toPath());
}
Смотрите также
Не связанный с конкретной проблемой, использование bean-компонента с областью действия сеанса для этой цели не является идеальным. Скорее используйте представление или запрос с ограниченной областью действия. См. также Как правильно выбрать область действия bean-компонента? И, используя prependId="false"
не рекомендуется для других целей, кроме форм входа, привязанных к инфраструктуре входа, которая не поддерживает идентификатор JSF, добавленный в начале, в именах параметров запроса. См. также UIForm с prependId=false breaks ‹f:ajax render›.
person
BalusC
schedule
30.08.2013