Data URI scheme + download属性の挙動が変わった

以前、外部サイトを使用せずに小サイズのファイルをブログへ貼り付ける方法として、Data URI schemeとdownload属性を組み合わせる方法を記載しました。 

 

上記を記載した2022年10月はリンクをクリックする事でファイルとしてダウンロードが開始されたのですが、現在(2023年2月)はクリックしても反応がありません。

ただ、右クリックして[名前を付けてリンク先を保存...]を選択すればファイルとして保存は可能です。

 

おそらく、どこかのUpdateで変更になったのだと思いますが、どのバージョンで変更されたのかはわかりません。

なお、この挙動変更は下記ブラウザで確認しました。
 WindowsGoogle Chrome
 WindowsMicrosoft Edge
 AndroidGoogle Chrome

下記ブラウザでは挙動に変更がありませんでした。(クリックでダウンロードが開始される)
 AndroidFirefox Nightly

 

MozillaW3Cのドキュメントを流し読みする限りは以前の動作で問題ない(というか以前の動作が正しい)と思うのですが…。

なにかの不具合や脆弱性の対策に伴って挙動が変わったが、わざわざ挙動を戻す必要はないのでそのまんまって感じなんですかね…。

ファイルをダウンロードできるブログの記載方法

2023-02-03:気付いたらブラウザの挙動が変わっていたので少し追記しました。

 

ブログへファイルを添付するには…と少し調べてみると、Googleドライブ等の外部サイトへファイルをアップロードしてそのリンクを貼り付けるのが一般的なようです。

 

結論から言うと、この方法が良いと私も思います。

 

ただ、サイズの小さなファイルを少しだけ貼り付けたいだけなので何とかならないか試してみたので、その結果を記載します。

 

Data URI scheme

まず思いついたのは電子メールのようにBase64エンコードして本文中(HTML)にファイルを埋め込めないか?という事です。

少し調べてみるとData URI schemeという、そのまんまの手段がありました。

こちらを参考にHTML編集で下記のように記載すると…

<a href="data:image/png;base64,iVBORw0KGgoAAA
ANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4
//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU
5ErkJggg==" download="reddot.png">reddot.png</a>

↓実際に入力した結果

reddot.png

期待通りpngファイルのダウンロードができました。

気付いたら挙動が変わっていて、現在(2023年2月)は多くのブラウザでクリックでダウンロードが開始されません。
右クリックで[名前を付けてリンク先を保存...]を選択する必要があります。

 

んじゃ、Zipファイルで…

<a href="data:application/zip;base64,
UEsDBBQAAAAAABFOXlVe+tHeDgAAAA4AAAAIAAAAdGVzdC50eHSCxIK3gsaDZoFb
g14NClBLAQIUABQAAAAAABFOXlVe+tHeDgAAAA4AAAAIAAAAAAAAAAAAIAAAAAAA
AAB0ZXN0LnR4dFBLBQYAAAAAAQABADYAAAA0AAAAAAA=
" download="test.zip">test.zip</a>

としたら、HTML編集で保存を行うとhref="..."の部分がごっそり削除されてしまいました。

いろいろなMIMEタイプを試してみましたがimage以外はすべて削除されてしまうようです。

○ image

× application,audio,video,text,font,model

 

管理者が画像以外はアップロードしてほしくなくて付いている機能だと思います。

そのため、最初に記載した通りGoogleドライブ等の外部サイトを利用した方が良いという結論となりました。

 

 

ただダウンロード後は拡張子でファイル種別を判断することになるので、下記のようにしてしまえばZipファイルもダウンロードすることは可能だったりします。(ブラウザやOSに依存しそうな気がしますが…)

<a href="data:image/jpeg;base64,
UEsDBBQAAAAAABFOXlVe+tHeDgAAAA4AAAAIAAAAdGVzdC50eHSCxIK3gsaDZoFb
g14NClBLAQIUABQAAAAAABFOXlVe+tHeDgAAAA4AAAAIAAAAAAAAAAAAIAAAAAAA
AAB0ZXN0LnR4dFBLBQYAAAAAAQABADYAAAA0AAAAAAA=
" download="test.zip">test.zip</a>

test.zip

Ootakeにリンクできるlibchdrのビルド方法

libchdrはCHDファイル読込を行うためのライブラリでRetroArchのPCエンジンエミュレーションコア(Beetle PCE FAST)でも使用されています。

https://github.com/rtissera/libchdr

これなら簡単にOotakeへ取り込めそう…と思ったのですが、リンク時に少しハマったのでメモを残します。

結論から記載すると、Ootakeのランタイム ライブラリのオプションは/MTなのでlibchdrも/MTでコンパイルしましょう!という昔からよくある問題でした。

libchdrのビルド

取得したlibchdrのソースを適当なフォルダへ保存。Visual Studio 2022を起動し、「ローカルフォルダを開く」から、そのフォルダを開く。(CMakeLists.txtのあるlibchdr内で一番上のフォルダ)

 

「CMake 生成が完了しました。」と出力されたら「CMake 設定エディターを開く」。

 

Configurationsの[+]をクリックして、"x86-Release"を追加。

 

Configuration typeを"Release"に変更。(RelWithDebInfoのままでも良いかもしれないが念のため…)

 

CMakeSettings.jsonを保存しなければ"x86-Release"へ切り替えられないのでCtrl+Sで保存。

 

"x86-Release"へ切り替え。「CMake 生成が完了しました。」と出力されるまで少し待つ。

 

CMakeSettings.jsonウィンドウ内下部の"Show advanced variables"にチェックを入れる。

CMAKE_C_FLAGS_DEBUG, CMAKE_C_FLAGS_MINSIZEREL, CMAKE_C_FLAGS_RELEASE, CMAKE_C_FLAGS_RELWITHDEBINFOの「/MD」を「/MT」に変更。(CMAKE_C_FLAGS_RELEASEだけで良い気がするが念のため全部)

Ctrl+SでCMakeSettings.jsonを保存してから、ビルド開始。

 

上記手順で下記2つのスタティックライブラリが作成されました。

\out\build\x86-Release\chdr-static.lib

\out\build\x86-Release\deps\lzma-22.01\lzma.lib

zlib.libもほしいのですが\out\build\x86-Release\deps\zlib-1.2.12にはdllのみでlibが作成されていませんでした。

 

zlibのビルド

CMakeでの設定でchdr-static.lib,lzma.libと同時にzlib.libも作成されるように変更できるのかも知れませんが、良くわからなかったので手動でzlib.libを作成します。

 

Visual Studio 2022を起動。「ローカルフォルダを開く」から"\deps\zlib-1.2.12"を開きlibchdrと同様の手順でビルドします。(/MDから/MTへの変更も含めて、すべて同様の手順)

これでzlib.libも手に入りました。

\deps\zlib-1.2.12\out\build\x86-Release\zlib.lib

 

libchdrの利用

libchdrのソース中にあるincludeディレクトリ以下のファイルを適当にコピーして、そのディレクトリをOotakeのプロジェクトの「追加のインクルード ディレクトリ」に追加。

include
    +---dr_libs
    |       dr_flac.h
    |
    \---libchdr
            bitstream.h
            cdrom.h
            chd.h
            chdconfig.h
            coretypes.h
            flac.h
            huffman.h

今回の手順で作成した3つのスタティックライブラリを適当なディレクトリにコピーして、そのディレクトリをOotakeのプロジェクトの「追加のライブラリディレクトリ」に追加。

lib
    chdr-static.lib
    lzma.lib
    zlib.lib

\tests\benchmark.cを参考にchd.hをインクルードし、3つのライブラリをリンクするようにすれば、chd.hに定義されている各種関数が利用可能となります。

#include <libchdr/chd.h>
#pragma comment( lib, "zlib" )
#pragma comment( lib, "lzma" )
#pragma comment( lib, "chdr-static" )

....

 

patch

 

Ootakeのビルド環境構築

"Ootake"はKitao Nakamura.様が公開されてる「PCエンジン」のエミュレーターソフトです。
その"Ootake"のビルド環境の構築について、手順を記載したいと思います。

  1. "Visual Studio 2022"のインストール
  2. プラットフォームツールセット"v141_xp"の追加
  3. "Microsoft DirectX SDK (June 2010)"のインストール
  4. dinput.libの追加
  5. "Windows 8 SDK"のインストール
  6. Ootake.rcの変更

"Visual Studio 2022"のインストール

Ootake(Ver3.04 2022/05/30)の開発環境は"Visual Studio 2022"とReadme.txtに記載されてています。

"Visual Studio Community 2022"をダウンロードします。

ワークロードの「C++によるデスクトップ開発」をチェックしてインストールします。

プラットフォームツールセット"v141_xp"の追加

インストールした"Visual Studio 2022"でビルドしようとしても下記のようなエラーが発生します。

 

Visual Studio 2022”へ"v141_xp"を追加するため、”Visual Studio 2022”と同時にインストールされている"Visual Studio Installer"を起動。

上部タブで「個別のコンポーネント」を選択し、検索窓に"XP"を入力。絞り込まれた中から、「VS 2017(v141)ツールのC++ WindowsXPサポート」にチェックを入れて[変更]をクリックする。

"Microsoft DirectX SDK (June 2010)"のインストール

まだエラーします。

 

xaudio2.hについて調べてみるとDirectX関係であることがわかります。

また、プロジェクトの「追加のインクルードディレクトリ」を確認するとバージョンは"Microsoft DirectX SDK (June 2010)"であることもわかります。

"Microsoft DirectX SDK (June 2010)"は下記からダウンロード可能です。(2022/10/28現在)

https://www.microsoft.com/ja-JP/download/details.aspx?id=6812

dinput.libの追加

まだまだ。

 

この"dinput.lib"についてReadme.txtを見ると作者様の熱い想いが伝わってきます…

出来れば"October 2004"以前のdinput.libを用意したいですが、作者様が記載されているとおりMicrosoftには見当たりません。また"August 2006"も現在は消えてしまっているようです。

そのため、下記からdinput.libのみを取り出し"C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86"へ追加しました。

https://archive.org/details/dxsdk_oct2004

"Windows 8 SDK"のインストール

もうちょっと。

 

プロジェクトの「追加のライブラリディレクトリ」を確認すると"C:\Program Files (x86)\Windows Kits\8.0"が追加されています。

 

下記によると、このディレクトリはWindows SDK 8.0のインストール先のようです。

https://wiki.onakasuita.org/pukiwiki/?Windows%20SDK

下記から”Windows 8 SDK"をダウンロードしインストールします。

https://developer.microsoft.com/ja-jp/windows/downloads/sdk-archive/

Ootake.rcの変更

最後にOotake.rcのアイコンファイルへのパスが"E:\\VSprojects\\Ootake\\Ootake.ico"と絶対パスになっているので、"Ootake.ico"と相対パスへ変更すればビルドが通るはずです。