还是不能免俗, 做了个文件传输工具(支持 P2P) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
edwardwo
V2EX    分享创造

还是不能免俗, 做了个文件传输工具(支持 P2P)

  •  
  •   2018-08-16 13:54:47 +08:00 8428 次点击
    这是一个创建于 2612 天前的主题,其中的信息可能已经有所发展或是发生改变。

    介绍

    前端 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%都能连接, 因此非常适合部署在办公室内, 以满足临时传输大文件这种需求.

    17 条回复    2018-08-19 12:52:01 +08:00
    s2555
        1
    s2555  
       2018-08-16 15:07:23 +08:00
    已 star
    BugProducer
        2
    BugProducer  
       2018-08-16 19:32:40 +08:00
    办公室临时传输大文件,我选 QQ...
    oska117
        3
    oska117  
       2018-08-16 19:43:26 +08:00 via Android
    谢谢,研究一下
    Tink
        4
    Tink  
    PRO
       2018-08-16 22:29:01 +08:00 via iPhone
    类似于 filepizza ?
    c247327248
        5
    c247327248  
       2018-08-17 02:11:51 +08:00 via iPhone
    有点意思
    qdwang
        6
    qdwang  
       2018-08-17 07:10:54 +08:00 via iPhone
    需要本地开一个服务吗
    cnTangLang
        7
    cnTangLang  
       2018-08-17 09:14:02 +08:00
    不错,这个对远程团队有价值
    edwardwo
        8
    edwardwo  
    OP
       2018-08-17 09:30:52 +08:00
    @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 到你的项目中即可.
    qdwang
        9
    qdwang  
       2018-08-17 11:55:45 +08:00 via iPhone
    好的 谢谢
    886106
        10
    886106  
       2018-08-17 12:03:51 +08:00
    这个可以配合 VPS 使用么?还有上传文件最大支持多大? 感谢
    edwardwo
        11
    edwardwo  
    OP
       2018-08-17 15:04:27 +08:00
    @886106 当然可以, 我就是部署在青云的服务器上. 上传文件的个数和大小, 取决于 2 个参数值: maxUpload(单个页面最多允许上传多少文件), maxFileSize(单个文件允许多大, 如: 20m, 5M), 我的小网站, 带宽 /磁盘有限, 因而只允许最大上传 5M 的文件.
    github 上我增加了一个中文的 readme.md:
    https://github.com/edwardwohaijun/file-transfer/blob/master/README_cn.md
    页面上有详细说明.
    886106
        12
    886106  
       2018-08-18 15:49:14 +08:00
    @edwardwo 收到感谢
    pagxir
        13
    pagxir  
       2018-08-18 16:22:08 +08:00
    qdwang
        14
    qdwang  
       2018-08-19 06:31:09 +08:00 via iPhone
    lz 我还想问问看,你这个支持的浏览器,是不是 ios11 以上和安卓的 chrome 都支持啊?
    qdwang
        15
    qdwang  
       2018-08-19 06:31:20 +08:00 via iPhone
    ios 的 safari
    edwardwo
        16
    edwardwo  
    OP
       2018-08-19 10:45:55 +08:00
    @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), 还有个很帅的功能(视频聊天), 这个目前几乎是全平台都支持了. 我在想要不要把这个功能加在我的这个网站上呢.
    qdwang
        17
    qdwang  
       2018-08-19 12:52:01 +08:00 via iPhone
    @edwardwo 感谢回复。我看了你这个文章,就去也研究了一下 webrtc。但是我发现在 ios 11 的 safari 上面,没法获取 candidates。这样就没法通讯了。ios 12 好像可以。不知道为什么。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2920 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 12:53 PVG 20:53 LAX 05:53 JFK 08:53
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86