前端 React, 后端 Golang(基本都是 stdlib 中的 pkg, 没有用到框架). 本人去年还写了个 P2P 文件传输工具simple-filer, 因此一并将此功能整合到网站中. 只要发送 /接受方同时打开同一张页面, 就可以实现 P2P 传输. (注意: P2P 传输只支持 Chrome 浏览器)
只需把页面 URL 发给你的好友, 他 /她就能看到你上传的文件, 你不需要等到上传完毕再发 URL, 所有打开该页面的用户都能实时看到上传进度. 你也可以打开多个 tabs 页体验一下.
由于是个人小网站, 带宽 /磁盘资源有限, 一个页面最多只能上传 4 个文件, 每个最大 5M, 页面有效期 20 分钟, 过了后, 相应的文件都删除, 页面的 URL 也会失效(返回 404). 对于 P2P 传输, 由于底层用到了 Chrome 浏览器的 FileSystem API, 文件直接写入 sandboxed filesystem, 因此没有文件大小 /个数的限制. 只要接受方硬盘足够大, 10G 也可以传输. 只要多人同时打开一张页面, 他们的昵称就会出现在页面左侧下方, 选中, 即可发送文件.
P2P 连接并非 100%的情况下都能建立, 只要一方位于比较严格的防火墙背后, 就无法建立, 此时你好友的昵称呈灰色无法选中. 但在局域网中, P2P 几乎 100%都能连接, 因此非常适合部署在办公室内, 以满足临时传输大文件这种需求.
1
s2555 2018-08-16 15:07:23 +08:00
已 star
|
2
BugProducer 2018-08-16 19:32:40 +08:00
办公室临时传输大文件,我选 QQ...
|
3
oska117 2018-08-16 19:43:26 +08:00 via Android
谢谢,研究一下
|
4
Tink 2018-08-16 22:29:01 +08:00 via iPhone
类似于 filepizza ?
|
5
c247327248 2018-08-17 02:11:51 +08:00 via iPhone
有点意思
|
6
qdwang 2018-08-17 07:10:54 +08:00 via iPhone
需要本地开一个服务吗
|
7
cnTangLang 2018-08-17 09:14:02 +08:00
不错,这个对远程团队有价值
|
8
edwardwo OP @Tink FilePizza 底层也是用 webRTC 实现 P2P 传输的, 数据不经过服务端, 因此它需要发送方的页面一直打开, 直到接受方收完为止. 由于 FilePizza 还支持 Firefox, 因此我觉得传输的文件不能大于接受方内存允许的大小. 而我的 app 仅支持 Chrome(有个 FileSystem API, 可以把数据直接写入硬盘), 因此可以传输超大文件.
@qdwang 这个应用本身就是一个服务, 只需占据一个端口即可. 安装部署步骤如下: 首先要安装如下软件: Golang (>= 1.9.2), 需要设置 $GOPATH 环境变量 MongoDB (>= 3.2) NodeJS (>=6.5) 客户端 JS 文件打包之用 下载安装: go get github.com/edwardwohaijun/file-transfer/cmd/filetransferd cd $GOPATH/src/github.com/edwardwohaijun/file-transfer/ go build -o filetransferd cmd/filetransferd/main.go cd web npm install npm run build (适用于开发, 测试环境) npm run ship (适用于生产环境) cd .. ./filetransferd 直接运行编译后的可执行文件即可, 虽然有 10 几个参数, 但都有默认值. 打开 Chrome 访问: http://127.0.0.1/9090 后端的代码几乎都是针对"上传文件"这个功能, 如果你仅仅想实现 P2P 传输, 可以使用我的另外一个 JavaScript library: simple filer ( https://github.com/edwardwohaijun/simple-filer ), 直接 import 到你的项目中即可. |
9
qdwang 2018-08-17 11:55:45 +08:00 via iPhone
好的 谢谢
|
10
886106 2018-08-17 12:03:51 +08:00
这个可以配合 VPS 使用么?还有上传文件最大支持多大? 感谢
|
11
edwardwo OP @886106 当然可以, 我就是部署在青云的服务器上. 上传文件的个数和大小, 取决于 2 个参数值: maxUpload(单个页面最多允许上传多少文件), maxFileSize(单个文件允许多大, 如: 20m, 5M), 我的小网站, 带宽 /磁盘有限, 因而只允许最大上传 5M 的文件.
github 上我增加了一个中文的 readme.md: https://github.com/edwardwohaijun/file-transfer/blob/master/README_cn.md 页面上有详细说明. |
13
pagxir 2018-08-18 16:22:08 +08:00
|
14
qdwang 2018-08-19 06:31:09 +08:00 via iPhone
lz 我还想问问看,你这个支持的浏览器,是不是 ios11 以上和安卓的 chrome 都支持啊?
|
15
qdwang 2018-08-19 06:31:20 +08:00 via iPhone
ios 的 safari
|
16
edwardwo OP @qdwang 很遗憾, 不支持 iOS, 目前这个 P2P 功能只支持桌面 Chrome. webRTC 虽然是 w3c 标准, Firefox, Safari 11(桌面, iOS)都支持了. 但我的 app 主要是以文件传输为主, 为了能传输超大文件, 底层用到了 Filesystem API, 这个不是 w3c 标准, 是 Google 自己倒腾出来的. 而 iOS 平台上的 Chrome 浏览器, 底层的 rendering 和 javascript 引擎用的是 Apple 的引擎(Apple 就是这么规定的: 在我的平台上必须用我的技术.). 因此, 也不支持这个 API.
如果我不用 filesystem API 的话, 理论上到是可以支持全平台(桌面 /iOS/android), 但这样只能传输小文件, 而且底层有许多兼容性问题, 开发工作量也非常巨大. webRTC 除了可以发文件(底层用了 data channel), 还有个很帅的功能(视频聊天), 这个目前几乎是全平台都支持了. 我在想要不要把这个功能加在我的这个网站上呢. |