--
結論
為了突破 Android 從相簿、網頁上傳移除地理資訊,必須從檔案使用分享來上傳照片。
--
分享
要使用分享,除了寫 App 也可以使用 PWA,不過 PWA 的分享只支援 Android 可能 iOS 沒有這個問題吧
--
實作
manifest.json
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "share_target": { "action": "/share-target", "method": "POST", "enctype": "multipart/form-data", "params": { "files": [ { "name": "shared_files", "accept": [ "*/*" ] } ] } } } |
sw.js
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
self.addEventListener('fetch', function (e) { var u = new URL(e.request.url), t = new URL('/share-target', self.registration.scope); if (e.request.method === 'POST' && u.pathname === t.pathname) e.respondWith(handleShare(e.request)); }); async function handleShare(request) { try { var form = await request.formData(); var files = form.getAll('shared_files').filter(function (x) { return x instanceof File; }); if (!files.length) throw new Error('沒有收到分享檔案'); await saveFiles(files); return Response.redirect(new URL('/Home/SharedFiles', self.registration.scope).href, 303); } catch (error) { console.error('[SW] 處理分享檔案失敗:', error); } } function openDB() { return new Promise(function (resolve, reject) { var r = indexedDB.open(DB_NAME, DB_VERSION); r.onupgradeneeded = function () { if (!r.result.objectStoreNames.contains(STORE_NAME)) r.result.createObjectStore(STORE_NAME, {autoIncrement: true}); }; r.onsuccess = function () { resolve(r.result); }; r.onerror = function () { reject(r.error); }; }); } async function saveFiles(files) { var db = await openDB(); try { await new Promise(function (resolve, reject) { var tx = db.transaction(STORE_NAME, 'readwrite'), s = tx.objectStore(STORE_NAME); files.forEach(function (f) { s.add({name: f.name, type: f.type, size: f.size, lastModified: f.lastModified, file: f, timestamp: Date.now()}); }); tx.oncomplete = resolve; tx.onerror = function () { reject(tx.error); }; tx.onabort = function () { reject(tx.error || new Error('IndexedDB 寫入中止')); }; }); } finally { db.close(); } } |
/Home/SharedFiles 就是檔案分享接收後處理網頁及程式,可以使用 AI 寫就好
--
3 total views, 3 views today
