是否可以在java中将.swf文件转换为base64格式

时间:2013-07-16 05:43:28

标签: java html flash

我正在尝试在我的页面中加载.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>

提前感谢。

1 个答案:

答案 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();
}

这应该可以解决问题,也许是一些很好的调整,以使代码适应您的特定情况,优化它并更好地处理错误...