2012-02-18 31 views
5

Tôi có một servlet đã thay đổi kích thước và mã hóa hình ảnh thành base64. Tôi mã hóa nó như thế nàyXử lý sự cố trả về vận chuyển Base64 từ Java và gửi tới trình duyệt

BufferedImage newBuf = .. a bufferedImage... 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(bufferedImage, sImgFormat, baos); 
baos.flush(); 
imageInBytes = baos.toByteArray(); 

sau đó tôi mã hóa này vào base64 để gửi cho trình duyệt như thế này

sun.misc.BASE64Encoder encoder = new BASE64Encoder(); 
String sEncImage = "data:image/jpg;base64," + encoder.encodeBuffer(imageInBytes); 

Trình duyệt sẽ nhận được mã hóa và nó hoạt động trừ các kí tự xuống dòng, ("\ n ") được nhúng một cách nhất quán trong chuỗi làm hỏng hình ảnh. Khi tôi gỡ bỏ các vận chuyển trả về hình ảnh là tốt. Có cách nào để tạo ra các mã hóa mà không có sự trả về vận chuyển. Hay tôi phải lọc nó ra trước khi gửi lại?

(Tôi đang sử dụng J2SE 1.4.2 và cần phải tiếp tục làm như vậy)

+0

Tại sao không gửi luồng byte? – Alanmars

+0

Tôi cần gửi văn bản base64 tới trình duyệt. HTML5 ở đầu bên kia – giulio

+0

\ n không phải là ký tự trả về dòng, nó là một nguồn cấp dữ liệu dòng. \ r là vận chuyển trở lại. https://stackoverflow.com/questions/3091524/what-are-carriage-return-linefeed-and-form-feed – Achille

Trả lời

4

Tôi nghi ngờ rằng sun.misc.Base64encoder được chunking đầu ra. Tôi sẽ không sử dụng các lớp sun.misc vì nó hạn chế mã của bạn thành Oracle JVM (ví dụ, nó sẽ hoạt động trong IBM Websphere). Tôi sẽ sử dụng bộ mã hóa commons Base64 hoặc Base64OutputStream.

+0

Khi bạn có nghĩa là "chunking", nó đặt dấu phân cách "\ n" sau mỗi "đoạn". Vì vậy, các Base64 commons sẽ cung cấp một chuyển đổi base64 "thuần túy"? – giulio

+0

các lớp sun.misc không tồn tại trong các JVM không phải là oracle trong khi các Base64 của Commons hoạt động trong tất cả các JVM. Có chunking đặt một vận chuyển trở lại sau mỗi 76 ký tự. – beny23

+0

Ok. Chỉ cần xác nhận, codec commons tương thích với 1.4? – giulio

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