
transfer.sh的隐藏能力多文件zip合并下载与浏览器预览页源码剖析【免费下载链接】transfer.shEasy and fast file sharing from the command-line.项目地址: https://gitcode.com/gh_mirrors/tr/transfer.shtransfer.sh 是一款命令行极速文件分享工具一条 curl 命令即可上传并生成可下载链接。除了最常用的上传功能外它还藏着两个隐藏能力多文件 zip 合并下载服务端把多个文件实时打包成一个压缩包和浏览器智能预览页图片、视频、Markdown 直接在浏览器中渲染。这篇文章带你快速上手这两个功能并深入源码剖析它的实现原理。一、多文件 zip 合并下载一个 URL 打包多个文件 上传多文件的两种方式先把文件传到服务器。transfer.sh 支持两种上传姿势curl PUT 单文件上传$ curl --upload-file ./hello.txt https://transfer.sh/hello.txt $ curl --upload-file ./hello2.txt https://transfer.sh/hello2.txtPOST 表单一次传多个文件见 examples.md$ curl -i -F filedata/tmp/hello.txt -F filedata/tmp/hello2.txt https://transfer.sh/上传后你会得到类似https://transfer.sh/15HKz/hello.txt的下载链接其中15HKz是随机 token。用 URL 直接触发服务端打包真正的隐藏能力来了把多个文件路径用逗号放进 URL 的括号里以.zip结尾transfer.sh 就会在服务端把它们实时合并成一个压缩包下载示例来自 examples.md# 合并成 zip $ curl https://transfer.sh/(15HKz/hello.txt,15HKz/hello2.txt).zip -o merged.zip # 合并成 tar.gz $ curl https://transfer.sh/(15HKz/hello.txt,15HKz/hello2.txt).tar.gz -o merged.tar.gz支持的格式共有三种zip、tar、tar.gz。整个过程无需你自己先打包上传服务器边读取边压缩直接以流式响应返回。源码剖析zipHandler 是如何工作的三个打包功能的入口路由都注册在 server/server.go/(...).zip→zipHandler/(...).tar→tarHandler/(...).tar.gz→tarGzHandler核心实现在 server/handlers.go 的zipHandler中流程拆解如下步骤关键代码说明1. 解析文件列表strings.Split(files, ,)把 URL 中逗号分隔的token/filename逐个拆开2. 校验元数据s.checkMetadata(..., true)检查文件是否存在、下载次数/有效期是否用尽见 handlers.go3. 读取存储s.storage.Get(...)从 local / S3 / GDrive / Storj 等存储后端取文件流4. 写入 zipzw.CreateHeader(header)io.Copy注意Method: zip.Store采用不压缩的存储模式保证吞吐速度5. 流式响应zip.NewWriter(w)直接写 ResponseWriter压缩包边生成边发送不落盘几个值得注意的细节文件名生成transfersh-%d.zip用纳秒时间戳取uint16片段命名配合Content-Disposition: attachment头commonHeader让浏览器以下载方式保存。容错设计单个文件元数据校验失败时continue跳过该文件继续打包但存储读取失败文件真不存在则直接返回 404 终止避免给出残缺压缩包。计数联动checkMetadata第三个参数传true意味着合并下载同样会计入下载次数受Max-Downloads头限制。tarGzHandlerhandlers.go与tarHandlerhandlers.go结构几乎相同区别只是把archive/zip换成archive/tar外层再套一层compress/gzip流。反向操作上传时把整个目录压成 zip如果你要分享的是一个目录官方推荐的是本地打包再上传README.md# 把目录压成 zip 并上传 $ (cd $file zip -r -q - .) | curl --upload-file - https://transfer.sh/目录名.zip # 或管道上传 tar 包 $ tar -czf - /var/log/journal | curl --upload-file - https://transfer.sh/journal.tar.gz二、浏览器预览页链接不再是盲下预览页长什么样在浏览器里直接打开一个 transfer.sh 下载链接而不是 curl 它你会看到一个精心制作的预览页图片 / 视频 / 音频内嵌对应的img/video/audio播放器Markdown 文件先用 blackfriday 渲染成 HTML再用 bluemonday 清洗 XSS 后安全展示纯文本放进pre标签转义显示页面底部还有二维码、下载按钮和get/inline两种下载链接。什么时候显示预览、什么时候直接下载路由注册处server/server.go用了一个MatcherFunc做智能分流判定逻辑是客户端Accept头接受text/htmlacceptsHTML且没有 Referer或Referer 路径与当前链接不同→ 渲染预览页否则走getHandler直接下载文件。这个设计很巧妙你在聊天软件/论坛里点链接→ 无 Referer → 看到预览页确认内容再下载安全感拉满预览页里的下载按钮带上了匹配路径的 Referer → 直接开始下载不会无限套娃curl 等工具的Accept不含text/html→ 永远直接拿原始文件。源码剖析previewHandler 的渲染管线实现位于 server/handlers.go核心是一条按 MIME 类型选模板的分支链image/* → download.image.html video/* → download.video.html audio/* → download.audio.html text/x-markdown → blackfriday 渲染 bluemonday 清洗 text/plain → pre 转义展示 其他 text/* → download.sandbox.html沙箱 iframe 预览 其余类型 → download.html通用下载卡片其中两个技术亮点二维码生成用 go-qrcode 现场把直链编码成 150px 的 PNGbase64 内联进模板——扫码即传非常适合手机协作场景。XSS 双重防线Markdown 渲染用的是不安全模式blackfriday.Run但立即过一遍bluemonday.UGCPolicy()白名单过滤inline下载动作还会对可含 HTML 的 Content-Type 再次做SanitizeReader流式清洗handlers.go。下载链接的两种别名预览页提供的两个链接对应getHandler的action参数handlers.go/get/{token}/{filename}Content-Disposition: attachment强制下载README.md/inline/{token}/{filename}Content-Disposition: inline在浏览器内联打开。三、动手试一试自托管你的 transfer.sh 想体验全部隐藏功能最快的方式是 Docker 起一个本地实例README.mddocker run --publish 8080:8080 dutchcoders/transfer.sh:latest-noroot --provider local --basedir /tmp/然后# 上传两个文件 $ curl --upload-file ./a.txt http://localhost:8080/a.txt # http://localhost:8080/Ab12cd/a.txt $ curl --upload-file ./b.txt http://localhost:8080/b.txt # http://localhost:8080/Xy98zw/b.txt # 一条 URL 合并下载成 zip $ curl http://localhost:8080/(Ab12cd/a.txt,Xy98zw/b.txt).zip -o merged.zip再打开浏览器访问上传后返回的链接就能看到 Markdown 渲染、二维码预览页的完整效果。小结能力URL 形态源码位置多文件 zip 合并/(f1,f2).zipzipHandlertar / tar.gz 合并/(f1,f2).tar(.gz)tarHandler / tarGzHandler浏览器智能预览页直接点链接previewHandlerget / inline 别名/get/...、/inline/...getHandlertransfer.sh 用不到 200 行的 handler 代码就把服务端流式打包 浏览器内容嗅探预览这两件看似复杂的事做成了零配置能力。无论是运维传日志、开发传补丁还是普通用户共享文件这几个隐藏能力都值得写进你的日常工具箱。【免费下载链接】transfer.shEasy and fast file sharing from the command-line.项目地址: https://gitcode.com/gh_mirrors/tr/transfer.sh创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考