ByteScope

Device Transfer

檔案和整個資料夾,走在兩台裝置自己談出來的那條線上,中間沒有別人。

檔案在兩台裝置之間直接流動。配對伺服器只轉手連線資訊,永遠碰不到你傳的內容。

這台是哪一端?

先選一邊,把兩台配對起來再傳。兩端都要開著這個頁面。

這台負責讀檔案,把內容推到另一端。

哪些環境能用

只寫實際測過的結果。沒有親自跑過的一律標成未測試,不用猜的。

功能桌機AndroidiOS
配對與連線需要 WebRTC 與安全來源。可用未測試未測試
整個資料夾傳出去桌機 Chromium 會真的走過資料夾;Android 退回簡易選擇器;iOS Safari 只給檔案,給不了資料夾。可用部分可用不可用
在硬碟上重建目錄結構需要 File System Access 的資料夾選擇器,只有桌機 Chromium 有。部分可用不可用不可用
收成 zip其他環境的備援:先放進專屬空間,再下載。可用未測試未測試
擋住螢幕休眠用 Screen Wake Lock。沒有這個能力的環境,裝置一睡著傳輸就停。可用未測試未測試
跨網際網路中繼刻意不做。沒有中繼,兩台之間就得有路走,通常是同一個 Wi-Fi。不適用不適用不適用

資料夾等級的體驗是桌機對桌機和 Android。iOS 收得比送得好。

這個瀏覽器

  • WebRTC
  • 資料夾選擇器
  • 專屬空間
  • 螢幕喚醒鎖
  • 安全來源

關於這個工具

兩台裝置都開這個頁面,一台顯示 6 位數配對碼,另一台輸入或掃描,兩個瀏覽器就會替彼此談出一條直接連線。接著把檔案丟進來 — 整個資料夾也行,目錄結構原封不動 — 位元組就從一台流到另一台,不經過第三個地方。不用註冊、不用裝 App、沒有上傳表單那種容量上限,也不必等檔案先爬上伺服器再爬回來。在同一個 Wi-Fi 底下,速度就是網路能跑多快,實測可以到每秒數十 MB。

伺服器只轉手連線資訊,永遠碰不到檔案內容

這句值得看兩遍,因為它就是這頁存在的理由。兩個瀏覽器沒辦法自己找到對方,所以有一個很小的配對服務,把彼此的連線資訊 — 網路上的位址,以及那條加密通道的參數 — 遞給對方。它經手的就只有這些。等兩台之間的路一通,配對服務就退場,之後每一個位元組都走加密的 WebRTC 資料通道,在兩台之間直接流動。沒有儲存、沒有紀錄,也沒有東西可以外洩,因為檔案從來沒放上去過。想自己確認的話:傳輸時打開任一端的開發者工具看網路分頁就知道。

資料夾、驗證碼,還有斷線之後

資料夾會先送一份清單 — 每一條路徑、每一個大小 — 再一個檔案一個檔案地送,所以兩端都知道要期待什麼,進度條也才有意義。每個檔案在讀出時算一次 SHA-256,寫入時再算一次,兩個值對得上,接收端才會留下它;對不上就丟掉,而不是存成一個看起來像樣、其實是壞的檔案。大資料夾傳到一半斷線,重連之後會從停下來的地方接續:接收端說明每個檔案已經寫進去而且驗證過多少,傳送端跳過那些,只有缺的位元組會再走一次。路徑也不會被偷偷改寫 — 接收端系統存不下的名字,會被指名擋下,而不是變成另一個東西送到。

老實說的限制

資料夾等級的體驗,最好的是桌機對桌機和 Android;iOS 收得比送得好,因為 Safari 只肯把檔案交給網頁,不肯交資料夾。要在接收端的硬碟上重建真正的目錄樹需要 File System Access,所以那一半只有桌機 Chromium 有;其他環境會先把檔案暫存在瀏覽器的專屬空間,最後打包成一個 zip 交出來,超過 ZIP 格式能表示的範圍就自動分成好幾份。另外這裡刻意不做中繼伺服器:如果兩台之間沒有路可走 — 不同網路、中間卡了電信業者的 NAT — 這頁會直接叫你把兩台接到同一個 Wi-Fi,而不是安靜地把你的檔案推過我們自己的機器。

常見問題

我的檔案會經過你們的伺服器嗎?

不會。伺服器經手的只有連線資訊 — 兩個瀏覽器要找到彼此所需要的位址與通道參數。找到之後它就退到一邊,每一個位元組都在你的兩台裝置之間走加密通道直接流動。沒有上傳、沒有留在某個儲存桶裡的複本,事後也沒有東西要刪。想確認而不是相信的話:在任一端打開開發者工具的網路分頁,然後傳一個大檔案 — 你會看到配對那幾筆交換,之後什麼都沒有。

速度多快?資料夾可以多大?

同一個 Wi-Fi 下大約每秒數十 MB,幾 GB 的照片是一杯咖啡的時間,不是一個下午。大小上限來自接收端的儲存空間,不是我們:檔案是一小塊一小塊串流過去的,兩端都不會把整份抱進記憶體。實際的天花板是接收端的可用空間,以及當檔案是以 zip 而非資料夾形式收下時 ZIP 格式本身的限制,後者這頁會自動分成好幾份來處理。

傳到一半停了,要整個重來嗎?

不用,按重連。接收端會逐檔記錄「已經寫進硬碟而且驗證過幾個位元組」,續傳就是從這份紀錄長出來的,不是用猜的。傳送端會被告知哪些檔案已經完成而整個跳過,中斷的那個檔案則從接收端能證明自己持有的位置重新開始。斷線當下正在傳的檔案,不是從已驗證的點續傳,就是整份丟掉重送;驗證碼確認不了的半截檔案永遠不會被留著。

為什麼它叫我把兩台接到同一個 Wi-Fi?

因為這裡沒有中繼伺服器,而這是刻意的取捨,不是還沒做。中繼意味著你的檔案要穿過我們營運的機器,那正是這一頁想避開的性質,而且那份頻寬成本最後也會轉嫁回使用者身上。同一個網路上的兩台裝置幾乎都能直接連上;不同網路的兩台則要看雙方路由器怎麼做,有時通有時不通。不通的時候,這頁會直說,而不是硬撐。

到底哪些瀏覽器和裝置真的能用?

只要有 WebRTC 和安全連線就能配對成功,現在的桌機與行動瀏覽器都符合。整個資料夾傳出去這件事,桌機 Chromium 最順,它可以真的走過一個目錄;Android 會退回先讀完全部的簡易選擇器;iOS Safari 給的是檔案,不是資料夾。接收端要直接在硬碟上重建目錄樹只有桌機 Chromium 做得到,其他環境改成 zip 下載。這頁是在載入之後真的去問瀏覽器有哪些能力,再告訴你落在哪一格,不是從 user agent 猜的。