Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > сохранение и отображение изображений на сайте


Автор: ivanmakedonski 14.6.2014, 01:21
Мне нужно реализовать сохранение и отображение изображений на сайте. За основу взят компонент PrimeFaces - FileUpload - Single. Не знаю как реализовать бек-энд, прочитал мануал http://spec-zone.ru/RU/Java/Tutorials/2d/images/saveimage.html , вот что надумал, но не работает 
Код
@ManagedBean
public class FileUploadView extends Component {

    private UploadedFile file;

    public UploadedFile getFile() {
        return file;
    }

    public void setFile(UploadedFile file) {
        this.file = file;
    }

    public void handleFileUpload(FileUploadEvent event) {
        try {
                BufferedImage bufferedImage = ImageIO.read(file);
                File outputfile = new File("saved.png");
                ImageIO.write(bufferedImage, "png", outputfile);
            } catch (IOException e) {
            }
        FacesMessage message = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, message);
    }

}

Ругается на участок кода 
Код
BufferedImage bufferedImage = ImageIO.read(file);

no suitable method found to read(UploadedFile) - не может конвертировать UploadedFile в File.

Нужно переводить в двоичный формат? Еще интересует как указывать путь сохранения для файла.

Спасибо.

Автор: Pawl 14.6.2014, 07:19
Проще всего воспользоваться гугловской библиотекой commons-io:
Код

File outputfile = new File("saved.png");
FileUtils.copyInputStreamToFile(uploadedFile.getInputStream(), outputfile);

Можно еще посмотреть в сторону java.nio из JDK 7, а именно, интерфейсов Paths, Path и класса Files.
Цитата(ivanmakedonski @  14.6.2014,  01:21 Найти цитируемый пост)
Еще интересует как указывать путь сохранения для файла.

А в чём проблема? указываете, куда надо и сохраняете... Поэкспериментируйте с разными вариантами, потом поищите, где создался файл, так и определитесь. smile

Автор: ivanmakedonski 14.6.2014, 18:51
Спасибо.

Автор: ivanmakedonski 14.6.2014, 21:03
Хочу реализовать механизм добавления/отображения объявления. Сейчас такая ситуация - при добавлении объявления изображения сохраняются на файловую систему, а остальные данные сохраняются в бд, как можно связать их вместе для отображения на странице? 
Есть мысль добавить в бд отдельную связующую колонку, в нее добавлять числовые значения, а при добавлении объявления возвращать наибольшее значение, инкрементировать его и передавать обратно в бд на запись предварительно создавая уникальную папку равную значению в которой будут сохранены добавленые изображения. Соответственно вытаскивать на странице через бин, а при отображении страниц в пути до изображения добавлять нужный идентификатор. Тогда как быть если файлы загрузили, а сообщение отменили?
Возможно Вы подскажете более предпочтительный вариант. Заранее спасибо.

Автор: Pawl 16.6.2014, 17:05
Вот, почитайте эту http://toster.ru/q/21342.
Там есть совет:
Цитата

сохранять в базе ссылки на файлы или называть файлы по значением ключей. Причина: web-сервер и ОС сможет кэшировать эти данные, что достаточно существенно снижает нагрузку.

Возможно, это то, что вам надо.

Автор: ivanmakedonski 24.6.2014, 22:55
Есть коллекция бин-объектов
Код
ArrayList<Image> images; //Image объект

состоящая из
Код

//часть контроллера наполняющая ArrayList<Image> images;
while (rs.next()) {
                Image image = new Image();
                image.setId(rs.getInt("id"));
                image.setUser_id(rs.getInt("user_id"));
                image.setLot_id(rs.getInt("lot_id"));
                image.setImage(rs.getBytes("image"));
                
                images.add(image);
            }

нужно реализовать выборку из коллекции images в коллекцию selectedImages через lot_id, как это сделать? Вот на что хватило - 
Код

public ArrayList<Image> getImagesById(int id) {

        ArrayList<Image> selectedImages = new ArrayList<>();
        
        if(true){         //тут условие, если images.getImage.getLotId = id; - как реализовать эту строку? нужно вытянуть из коллекции конкретный объект Image для сравнения
            selectedImages.add(image);
        }
                          
        return selectedImages;
    }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)