Аплет не создает файл изображения через ImageIO.write

Я боролся с проблемой, связанной с эскизом обработки, который я хочу использовать для создания файла изображения (в каталог на стороне сервера). В Java я использую PImage холста, преобразованный в BufferedImage, который затем создается как файл через ImageIO.write.

Он успешно создает файл при запуске в качестве эскиза в моей системе, file.png отображается в той же папке, что и программа. Проблема в том, что когда программа экспортируется как апплет, она больше не создает файл. Было бы здорово, если бы у кого-нибудь был какой-либо ввод относительно того, почему эскиз программы может создавать изображение, а апплет - нет.

Вот пара фрагментов того, что я использую, если это может помочь. Спасибо всем.

PImage pimg = get();
BufferedImage canvas = convertToBufferedImage(pimg);
File file = new File("./sketch/file.png");
try
{
  ImageIO.write(canvas, "PNG", file);
}
catch (Exception e) { println(e); }

А вот метод преобразования PImage в BufferedImage.

BufferedImage convertToBufferedImage(PImage pimg){
    PGraphics pg = createGraphics(width, height, JAVA2D);
    pg.image(pimg, 0, 0);
    BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE);
    Graphics2D g2d = img.createGraphics();
    g2d.drawImage((java.awt.Image)pg.image, 0, 0, width, height, this);
    g2d.finalize();
    g2d.dispose();
    return img;
}

person Scott    schedule 10.01.2011    source источник
comment
Когда я меняю это, не возникает никаких исключений. Апплет работает нормально, но в каталоге не создается файл изображения. Еще одна странность заключается в том, что, когда это эскиз, если путь - это просто file.png, он фактически создает файл в родительском каталоге, поэтому я должен указать путь как ./sketch/file.png, чтобы сохранить его в том же каталоге. как эскиз. Когда я экспортирую его как апплет, если я изменю его на ./applet/file.png или просто file.png, его все равно нигде не будет видно.   -  person Scott    schedule 11.01.2011
comment
Пробовал. Возвращает true при запуске в качестве эскиза, файл .png успешно создан. Я по-прежнему не получаю ошибок при запуске как апплета.   -  person Scott    schedule 11.01.2011
comment
Апплеты не могут получить доступ к файлам на стороне сервера. Вы должны написать сервлет, если хотите это сделать.   -  person OrangeDog    schedule 11.01.2011


Ответы (1)


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

Взгляните на FileSaveService в JNLP. Это можно использовать из неподписанного апплета для сохранения файла в файловой системе на клиентском компьютере.

Если вы пытаетесь записать в каталог на сервере из апплета, вы не можете сделать это напрямую. Вам нужно будет создать форму загрузки на сервере и, возможно, использовать HttpURLConnection для отправки запроса POST на сервер.

person finnw    schedule 10.01.2011
comment
Так является ли ImageIO.write неправильным подходом для достижения этой цели? Я видел такие решения, как кодирование BufferedImage в Base64String, которое затем получает и декодирует PHP. Это правильный способ отправить BufferedImage в PHP, который будет загружен сервером? - person Scott; 11.01.2011
comment
@Scott, ничего плохого в использовании ImageIO.write для кодирования изображения, но вам нужно будет отправить его в HttpURLConnection или массив байтов вместо файла. Посмотрите ответы на этот вопрос и этот. - person finnw; 11.01.2011
comment
Большое спасибо всем за дар знаний. Вероятно, это было самым многообещающим решением моей проблемы. stackoverflow.com/questions/1889881/ - person Scott; 11.01.2011