2011-01-31 28 views
13

Đối với một applet tôi đang làm việc, tôi cần chuyển đổi tệp BufferedImage thành luồng đầu vào để tôi có thể tải hình ảnh lên máy chủ MySQL của mình. Ban đầu tôi đã sử dụng mã này:Java chuyển đổi hình ảnh thành luồng đầu vào KHÔNG tạo tệp

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"); 
} 

(trong khi bắt các trường hợp ngoại lệ có liên quan) Mã treo trên phần nơi ứng dụng tìm cách lưu hình ảnh vào máy tính. Mã này hoạt động hoàn hảo trong Eclipse hoặc bất cứ khi nào tôi chạy applet từ localhost, vì vậy tôi giả định rằng vấn đề nằm trong các đặc quyền mà applet có trong việc lưu các tệp vào máy tính của người dùng.

Tôi đã tự hỏi liệu có cách nào để biến tệp hình ảnh thành một luồng đầu vào mà không phải lưu tệp vào máy tính của người dùng hay không. Tôi đã thử sử dụng:

ImageIO.createImageInputStream(image); 

Nhưng sau đó tôi không thể chuyển đổi số ImageInputStream trở lại thành InputStream. Bất kỳ đề xuất?

Cảm ơn!

+2

argh! cùng một mã mà đọc từ một cơ sở dữ liệu xử lý hình ảnh !! Đó là khủng khiếp. Vui lòng đọc: [Gắn kết] (http://en.wikipedia.org/wiki/Cohesion_ (computer_science)), [Khớp nối] (http://en.wikipedia.org/wiki/Coupling_ (computer_science)) –

+0

Có thể là không phải là thực hành tốt nhất. Cảm ơn bạn đã thông tin, tôi sẽ phải khắc phục điều đó sau. – David

+0

Có thể trùng lặp [Làm cách nào để chuyển đổi BufferedImage thành InputStream?] (Http://stackoverflow.com/questions/4251383/how-to-convert-bufferedimage-to-inputstream) –

Trả lời

26

Thông thường bạn sẽ sử dụng ByteArrayOutputStream cho mục đích đó. Nó hoạt động như một luồng trong bộ nhớ.

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

Tuyệt vời nhưng một điều nữa, tôi cần độ dài của dòng để tạo BinaryStream, vì vậy tôi sẽ sử dụng chiều dài os.toByteArray(). – David

+3

Điều gì đã xảy ra khi bạn thử? –

+0

nó hoạt động hoàn hảo. Tôi đã sử dụng chiều dài os.toByteArray(). Và đoạn mã trên. – David

1

Bạn đã cố gắng viết thư cho một số ByteArrayOutputStream và sau đó tạo một ByteArrayInputStream từ dữ liệu đó để đọc từ? (Gọi toArray trên ByteArrayOutputStream và sau đó gọi hàm khởi tạo của ByteArrayInputStream sẽ bọc mảng byte đó.)

+2

Cảm ơn đề xuất, đó là cơ bản những gì tôi đã kết thúc làm nhưng câu trả lời khác thực sự cho em bé ăn mã. : P – David

1

Hãy cẩn thận khi sử dụng luồng BytArray: nếu hình ảnh lớn, mã đó sẽ không thành công. tôi đã không thực hiện nhiều mã hóa applet, nhưng có thể là thư mục tạm thời có sẵn để viết (ví dụ: File.createTempFile()).

+0

Cho đến nay nó đã hoạt động, nếu không, thì tôi sẽ phải sử dụng nó. Cảm ơn – David

Các vấn đề liên quan