2

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

提前致谢。

4

1 回答 1

1

尝试以 base64 格式获取文件不会加快文件传输速度,反之亦然,因为它将以字节存储的文件(如果可以这样说是 base256)转换为 base64(64 个可打印字符),所以您将要传输的最终数据量更多。

唯一的“胜利”是您可以将其作为页面的一部分加载,而不是让浏览器再次调用 swf 文件,这在 http 1.1 上应该没有问题。

除非您有其他充分的理由这样做,否则我不会建议这种做法。

如果您将 swf 文件作为 blob 保存在数据库中,您可以只创建一个设置正确内容类型的 servlet,并使用 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();
}

这应该可以解决问题,也许可以进行一些微调以使代码适应您的具体情况,优化它并更好地处理错误......

于 2013-07-16T07:59:01.280 回答