Какой правильный путь для Toolkit.getImage ()? - PullRequest
3 голосов
/ 06 сентября 2011

Мне нужно загрузить файл изображения и создать миниатюру для загруженного файла в моем веб-приложении JSF.Исходное изображение сохраняется на сервере в /home/myname/tomcat/webapps/uploads, а миниатюра сохраняется в /home/myname/tomcat/webapps/uploads/thumbs.Я использую класс генератора миниатюр, скопированный с philreeve.com .

. Я успешно загрузил файл с помощью BalusC .Но с помощью Toolkit.getImage() я не могу получить доступ к изображению.

Я использовал абсолютный путь к загруженному файлу, например так:

inFilename = file.getAbsolutePath();

Соответствующий код из генератора миниатюр:

public static String createThumbnail(String inFilename, String outFilename, int largestDimension) {
    ...
    Image inImage = Toolkit.getDefaultToolkit().getImage(inFilename);
    if (inImage.getWidth(null) == -1 || inImage.getHeight(null) == -1) {
        return "Error loading file: \"" + new File(inFilename).getAbsolutePath() + "\"";
    }
    ...
}

Поскольку я уже использую абсолютный путь, я не понимаю, почему он не работает.Я также использовал следующие значения для inFilename, но всегда получаю «Ошибка загрузки файла ...».

  • /home/myname/tomcat/webapps/uploads/filename.ext
  • /uploads/filename.ext

Но я проверил каталог, и изображение там .(Я загрузил с помощью /home/myname/tomcat/webapps/uploads/filename.ext, и он работает.) Какой правильный путь для изображения в этом каталоге?Спасибо.

Обновление

Я получил код для работы с помощью:

Image inImage = ImageIO.read(new File(inFilename));

Я до сих пор не понимаю, почему Toolkit.getImage()не работает, хотя.

Ответы [ 3 ]

2 голосов
/ 24 октября 2013

Проблема в том, что Toolkit.getImage() не возвращает изображение сразу. Эта проблема хорошо описана в отчете об ошибке , соответствующий фрагмент которого приведен здесь:

Это не ошибка. Отправитель неправильно использует асинхронный API изображения правильно. Он предполагает, что getImage загружает все биты изображения в память. Тем не менее, это хорошо задокументировано, что фактическая загрузка бит не происходит до вызова Component.prepareImage или Graphics.DrawImage. Кроме того, эти две функции возвращают до Изображение полностью загружено. Разработчики обязаны установить ImageObserver прослушать уведомление о том, что изображение было полностью загружено. Однажды они получить это уведомление, они могут перекрасить изображение.

Я обнаружил, что ответ на этот вопрос хорошо работает:

Image image = new ImageIcon(this.getClass().getResource("/images/bell-icon16.png")).getImage();

2 голосов
/ 06 сентября 2011

Вы уверены, что это файл JPEG?Используйте средство просмотра изображений, чтобы убедиться, что с файлом ничего не случилось во время загрузки (или что это было изображение с самого начала).

Также, используйте new File(inFilename).exists(), чтобы убедиться, что путь указан правильно.Я также предлагаю печатать new File(inFilename).getAbsolutePath() в сообщениях об ошибках, потому что относительные пути могут причинить вам вред.

Тем не менее, остальная часть кода выглядит правильно.

0 голосов
/ 06 сентября 2011

Может быть, это проблема с правами доступа?Вы уверены, что у вашего скрипта есть права на чтение или просмотр файла?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...