Java конвертирует изображение во входной поток БЕЗ создания файла - PullRequest
15 голосов
/ 31 января 2011

Для апплета, над которым я работаю, мне нужно преобразовать файл 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.Есть предложения?

Спасибо!

Ответы [ 3 ]

27 голосов
/ 31 января 2011

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

ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(image,"png", os); 
InputStream fis = new ByteArrayInputStream(os.toByteArray());
1 голос
/ 31 января 2011

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

1 голос
/ 31 января 2011

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

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