我正在尝试在我的页面中加载.swf文件,我想通过将其转换为Base64来提高此负载,而不是提供src。通过使用以下代码
,这对图像格式非常有用Java代码
BufferedImage buffImg = ImageIO.read(new File(imagePath));
ImageIO.write(buffImg, imgExtension, bos);
byte[] imageBytes = bos.toByteArray();
BASE64Encoder encoder = new BASE64Encoder();
imageString = encoder.encode(imageBytes);
但这不适用于swf文件。是否有任何可能的方法来实现这一目标。
HTML
<object width="10" height="10" data="data:application/x-shockwave-flash;base64, RldTCSEAAABIAZAAZAAADAEARBEIAAAAQwIAAP9AAAAA"></object>
提前感谢。
答案 0 :(得分:1)
尝试在base64中获取文件不会加快文件传输速度,这恰好相反,因为它会将以字节存储的文件(base256,如果可以这样说)转换为base64(64个可打印字符) ,因此您将要转移的最终数据量更多。
唯一的“胜利”是您可以将其作为页面的一部分加载而不是浏览器再次调用swf文件,这在http 1.1上应该没有问题。
除非你有其他充分理由这样做,否则我不会建议这种做法。
如果您将数据库中的swf文件作为blob,那么您可以创建一个servlet来设置正确的contenttype并使用ServletOutputStream编写整个文件,而不使用任何标记。在你的html代码中,你必须引用servlet而不是固定文件。
如果您仍想将文件转换为base64,则不应使用某些图像API,而是以标准方式获取文件以获取二进制文件,以下是应该执行此操作的示例:
http://www.javapractices.com/topic/TopicAction.do?Id=245
一旦有了字节数组,你仍然可以进行编码:
File file = new File(imagePath);
log("File size: " + file.length());
byte[] result = null;
try {
InputStream input = new BufferedInputStream(new FileInputStream(file));
result = readAndClose(input);
}
catch (FileNotFoundException ex){
log(ex);
}
BASE64Encoder encoder = new BASE64Encoder();
imageString = encoder.encode(result);
readAndClose方法:
byte[] readAndClose(InputStream aInput){
byte[] bucket = new byte[32*1024];
ByteArrayOutputStream result = null;
try {
try {
result = new ByteArrayOutputStream(bucket.length);
int bytesRead = 0;
while(bytesRead != -1){
bytesRead = aInput.read(bucket);
if(bytesRead > 0){
result.write(bucket, 0, bytesRead);
}
}
}
finally {
aInput.close();
}
}
catch (IOException ex){
log(ex);
}
return result.toByteArray();
}
这应该可以解决问题,也许是一些很好的调整,以使代码适应您的特定情况,优化它并更好地处理错误...