Подтвердить что ты не робот

Java конвертирует изображение во входной поток БЕЗ создания файла

Для апплета, над которым я работаю, мне нужно преобразовать файл BufferedImage во входной поток, чтобы я мог загрузить изображение на свой сервер MySQL. Первоначально я использовал этот код:

Class.forName("com.mysql.jdbc.Driver").newInstance();  
Connection connection = 
    DriverManager.getConnection(connectionURL, "user", "pass");  

psmnt = connection.prepareStatement(
    "insert into save_image(user, image) values(?,?)");  
psmnt.setString(1, username);  

ImageIO.write(image, "png", new File("C://image.png")); 
File imageFile = new File("C://image.png");
FileInputStream fis = new FileInputStream(imageFile);

psmnt.setBinaryStream(2, (InputStream)fis, (fis.length()));
int s = psmnt.executeUpdate();

if(s > 0) {
  System.out.println("done");
}

(при улавливании соответствующих исключений) Код висит на той части, где апплет пытается сохранить изображение на компьютере. Код работал отлично в Eclipse или всякий раз, когда я запускал апплет из локального хоста, поэтому я предполагаю, что проблема заключается в привилегиях, которые апплет имеет для сохранения файлов на компьютер пользователя.

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

ImageIO.createImageInputStream(image);

Но потом я не смог преобразовать ImageInputStream обратно в InputStream. Любые предложения?

Спасибо!

4b9b3361

Ответ 1

Обычно для этой цели вы должны использовать ByteArrayOutputStream. Он действует как поток в памяти.

ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image,"png", os); 
InputStream fis = new ByteArrayInputStream(os.toByteArray());

Ответ 2

Пробовали ли вы писать ByteArrayOutputStream, а затем создавали ByteArrayInputStream из этих данных для чтения? (Вызовите toArray на ByteArrayOutputStream, а затем вызовите конструктор ByteArrayInputStream, который будет обертывать этот массив байтов.)

Ответ 3

Будьте осторожны с использованием потоков BytArray: если изображение велико, этот код не будет работать. я не сделал много апплетов, но возможно, что временный каталог доступен для записи (например, File.createTempFile()).