Flashのswfファイルは本体データ部分が圧縮されている場合があるようです。
それを非圧縮のファイルに変換するコードです。
swfを再生表示するJSのライブラリがいくつかありますが、ものによっては圧縮されていると再生できないライブラリがあったので調べて対応しました。
他の言語や圧縮形式でもほぼ同様の処理で対応できると思います。
<?php
// 入力ファイル
$input = __DIR__ . '/compressed.swf';
// 出力ファイル
$output = __DIR__ . '/uncompressed.swf';
// 先頭3バイトを読み込んで、圧縮形式の判定を行う
$signature = file_get_contents($input, false, null, 0, 3);
if ($signature !== 'CWS') {
// 圧縮で無ければ終了
exit();
}
// 非圧縮時のシグネチャー
$signature = 'FWS';
// シグネチャーの残り部分
$header = file_get_contents($input, false, null, 3, 5);
// 本体部分をzlibでデコードしたもの
$body = zlib_decode(file_get_contents($input, false, null, 8));
// 上記を連結してSWFファイルのデータにする
$data = $signature . $header . $body;
// ファイルに書き出す
file_put_contents($output, $data);
// このままWebで出力する場合はHTTPヘッダーと共にデータを出力する
// header('Content-Type: application/x-shockwave-flash');
// echo $data;
が、以下のライブラリだと圧縮データにも対応しています。
ActionScriptの対応バージョンも広く、2023年現在も継続的に開発されているようなので、そもそもこちらが良いのではないかと思います。
(ただし再生時にロゴが表示されるので、それが嫌な場合には一工夫が必要)