ByteScope

Device Transfer

2台が自分たちで作った経路の上を、ファイルもフォルダもそのまま流れていきます。

ファイルは2台のあいだを直接流れます。ペアリング用のサーバーが中継するのは接続情報だけで、中身は1バイトも通りません。

この端末はどちら側?

役割を選んで2台をペアリングし、そのまま送ります。両方の端末でこのページを開いたままにしてください。

この端末がファイルを読み出して相手へ流します。

どこで何が動くか

実際に確かめたことだけを書いています。試していないものは推測せず「未検証」と表示します。

機能デスクトップAndroidiOS
ペアリングと接続WebRTC と安全なコンテキストが必要です。動く未検証未検証
フォルダごと送るデスクトップの Chromium は実際のフォルダをたどります。Android は簡易版に、iOS Safari はファイル単位になります。動く一部動く動かない
ディスク上にフォルダを再現File System Access のフォルダ選択が必要で、デスクトップ Chromium のみです。一部動く動かない動かない
zip として受け取るそれ以外の環境の受け皿です。専用領域に置いてからダウンロードします。動く未検証未検証
画面を眠らせないScreen Wake Lock です。使えない環境では、眠った時点で転送が止まります。動く未検証未検証
インターネット越しの中継意図的に作っていません。中継がない以上、2台のあいだに経路が要ります。ふつうは同じ Wi-Fi です。対象外対象外対象外

フォルダ単位で快適に使えるのはデスクトップ同士と Android です。iOS は送るより受け取る方が得意です。

このブラウザー

  • WebRTC
  • フォルダ選択
  • 専用領域
  • 画面ロック解除防止
  • 安全なコンテキスト

このツールについて

両方の端末でこのページを開き、片方に出た6桁のコードをもう片方で入力するか QR で読み取ると、2つのブラウザーが互いへの直接接続を組み立てます。あとはファイルを放り込むだけ。フォルダごとでも構造はそのままです。アカウントもアプリのインストールも要らず、アップロード欄の容量制限もなく、いったんサーバーへ登ってからまた降りてくるのを待つ必要もありません。同じ Wi-Fi なら回線が出せるだけの速度で流れ、実測では毎秒数十メガバイトに届きます。

サーバーが扱うのは接続情報だけで、ファイルには触れません

ここは二度読む価値があります。2つのブラウザーは自力では互いを見つけられないので、小さなペアリング用サービスが相手側の接続情報 — ネットワーク上の宛先と、暗号化された通り道の設定 — を橋渡しします。扱うのはそれだけです。経路ができた時点でペアリング用サービスは退場し、以後すべてのバイトは暗号化された WebRTC のデータチャネルを通って2台のあいだを直接流れます。保存も記録もされません。そもそも置かれていないので、漏れる先がありません。転送中に開発者ツールのネットワークタブを見れば確かめられます。

フォルダ、チェックサム、そして切れたとき

フォルダはまず目録 — 全部のパスとサイズ — として送られ、そのあと1ファイルずつ流れます。だから両端が中身を把握でき、進捗の数字に意味があります。各ファイルは読むときと書くときの二度 SHA-256 を通し、両方の値が一致したものだけが受け側に残ります。合わなければ、それらしい壊れたファイルとして保存するのではなく捨てます。大きなフォルダの途中で切れても、再接続すれば止まった場所から続きます。受け側が「どのファイルをどこまで書いて検証済みか」を申告し、送り側は済んだものを飛ばして足りない分だけを流します。パスを黙って書き換えることもありません。受け側で保存できない名前は、別物に化けて届くより先に名指しで断ります。

正直な限界

フォルダ単位で気持ちよく使えるのはデスクトップ同士と Android です。iOS は送るより受け取る方が得意で、Safari はページにファイルは渡してもフォルダは渡しません。受け側でディスク上に本物のディレクトリを再現するには File System Access が要るため、そこはデスクトップの Chromium 限定です。それ以外の環境では、いったんブラウザーの専用領域に置いてから最後にひとつの zip として渡します。ZIP 形式が扱える範囲を超える大きさなら、自動的に複数に分けます。そして中継サーバーは意図的に置いていません。別々のネットワークにいるなどして2台に経路がないときは、こちらの機械にファイルを通すのではなく「同じ Wi-Fi につないでください」と正直に伝えます。

よくある質問

ファイルはそちらのサーバーを通りますか?

通りません。サーバーが扱うのは接続情報 — 2つのブラウザーが互いを見つけるための宛先とチャネル設定 — だけです。見つかった時点で退場し、以後すべてのバイトは暗号化された経路を通って2台のあいだを直接流れます。アップロードも、どこかに残る複製も、あとで消す対象もありません。信じる代わりに確かめたければ、どちらかの端末で開発者ツールのネットワークタブを開いたまま大きなファイルを送ってみてください。ペアリングのやり取りのあとは何も出てきません。

速度は? どれくらい大きなフォルダを送れますか?

同じ Wi-Fi なら毎秒数十メガバイトが目安です。写真が数ギガあってもコーヒー1杯ぶんで、午後をつぶすほどではありません。上限を決めるのは受け側の空き容量で、こちらではありません。ファイルは細切れで流れるので、どちらの端末も全体をメモリーに抱えることはないからです。実際の天井は受け側の空きと、フォルダではなく zip として受け取る場合の ZIP 形式そのものの制限で、後者はページが自動で複数に分けて回避します。

途中で止まりました。最初からやり直しですか?

いいえ、再接続を押してください。受け側はファイルごとに「ディスクへ書いて検証まで終わったバイト数」を持っていて、再開はその記録から組み立てられます。推測ではありません。送り側は完了済みのファイルを知らされてまるごと飛ばし、中断したファイルは受け側が保持を証明できる地点から流し直します。切れた瞬間に転送中だったファイルは、検証済みの地点から続くか、捨てて丸ごと送り直すかのどちらかです。チェックサムを確かめられない半端なファイルが残ることはありません。

なぜ「同じ Wi-Fi につないで」と言われるのですか?

中継サーバーを置いていないからで、これは機能の不足ではなく選択です。中継するということは、あなたのファイルがこちらの機械を通るということで、それはこのページが避けようとしている性質そのものです。帯域の費用もいずれ利用者に跳ね返ります。同じネットワークにいる2台はほぼ確実に直接つながります。別々のネットワークの2台は、双方のルーターの振る舞い次第でつながったりつながらなかったりします。つながらないときは、取り繕わずそう表示します。

実際にどのブラウザーと端末で動きますか?

接続そのものは WebRTC と安全な接続があればどこでも動き、これは現行のデスクトップ/モバイルのブラウザーすべてに当てはまります。フォルダごと送るのはデスクトップの Chromium がいちばん得意で、実際のディレクトリをたどれます。Android は先に全部読み込む簡易的な選択に、iOS Safari はフォルダではなくファイル単位になります。受け側でディスク上に構造を再現できるのはデスクトップ Chromium だけで、それ以外は zip のダウンロードになります。判定はユーザーエージェントの推測ではなく、読み込み後にブラウザーの機能を実際に調べて表示します。