<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>文件处理 on PlumePHP</title><link>https://plumephp.com/tags/%E6%96%87%E4%BB%B6%E5%A4%84%E7%90%86/</link><description>Recent content in 文件处理 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 05 Dec 2025 17:21:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/tags/%E6%96%87%E4%BB%B6%E5%A4%84%E7%90%86/index.xml" rel="self" type="application/rss+xml"/><item><title>Go 入门：用 text/template 生成一份朴素报表</title><link>https://plumephp.com/go-text-template-reports-2025/</link><pubDate>Fri, 05 Dec 2025 17:21:00 +0800</pubDate><guid>https://plumephp.com/go-text-template-reports-2025/</guid><description>&lt;p&gt;不是所有输出都需要 HTML。很多内部工具会生成纯文本日报、邮件正文、Markdown 摘要、配置片段或工单说明。直接用 &lt;code&gt;fmt.Fprintf&lt;/code&gt; 拼字符串可以起步，但字段一多，换行和缩进就会变得难维护。Go 标准库的 &lt;code&gt;text/template&lt;/code&gt; 很适合这类场景。&lt;/p&gt;</description></item><item><title>Go embed 模板布局入门：base、partial 和页面模板怎么组织</title><link>https://plumephp.com/go-embed-template-layouts-2025/</link><pubDate>Tue, 09 Sep 2025 15:18:00 +0800</pubDate><guid>https://plumephp.com/go-embed-template-layouts-2025/</guid><description>&lt;p&gt;Go 的 &lt;code&gt;html/template&lt;/code&gt; 可以渲染页面，&lt;code&gt;embed&lt;/code&gt; 可以把模板打进二进制。小型后台、内部工具、邮件预览页都很适合这种组合。问题是模板一多，如何组织 base layout、partial 和具体页面？如果随便 &lt;code&gt;ParseGlob&lt;/code&gt;，很快会乱。&lt;/p&gt;</description></item><item><title>Go 工作目录入门：为什么本地能读到文件，部署后却找不到</title><link>https://plumephp.com/go-working-directory-paths-2025/</link><pubDate>Thu, 07 Aug 2025 17:03:00 +0800</pubDate><guid>https://plumephp.com/go-working-directory-paths-2025/</guid><description>&lt;p&gt;“本地能跑，部署后找不到文件”是 Go 初学者常见问题。代码里写了 &lt;code&gt;templates/index.html&lt;/code&gt;，本地从项目根目录运行没事；部署成 systemd 服务后，工作目录变了，程序就报 &lt;code&gt;open templates/index.html: no such file or directory&lt;/code&gt;。问题不在 Go 编译，而在当前工作目录。&lt;/p&gt;</description></item><item><title>Go fs.FS 入门：让文件读取逻辑更容易测试</title><link>https://plumephp.com/go-fs-fs-testing-2025/</link><pubDate>Wed, 23 Jul 2025 08:39:00 +0800</pubDate><guid>https://plumephp.com/go-fs-fs-testing-2025/</guid><description>&lt;p&gt;很多代码会直接 &lt;code&gt;os.ReadFile(&amp;quot;config.json&amp;quot;)&lt;/code&gt;。这很简单，但测试时会依赖真实文件路径。Go 的 &lt;code&gt;io/fs&lt;/code&gt; 提供了 &lt;code&gt;fs.FS&lt;/code&gt; 接口，可以让函数从“文件系统”读取，而不关心这个文件系统来自磁盘、内存还是 embed。这样文件读取逻辑更容易测试。&lt;/p&gt;</description></item><item><title>Go 文件变化轮询入门：不用依赖也能做简单热加载</title><link>https://plumephp.com/go-file-watcher-polling-2025/</link><pubDate>Tue, 15 Jul 2025 16:29:00 +0800</pubDate><guid>https://plumephp.com/go-file-watcher-polling-2025/</guid><description>&lt;p&gt;监听文件变化常见做法是使用 fsnotify 这类库。但有些小工具不想引入依赖，只需要每隔几秒检查配置文件是否变了。这时轮询修改时间是一个简单可控的方案。它不够实时，但容易理解，也适合入门。&lt;/p&gt;</description></item><item><title>Go 入门：regexp 能做什么，不能替你做什么</title><link>https://plumephp.com/go-regexp-input-cleaning-2025/</link><pubDate>Tue, 29 Apr 2025 16:05:00 +0800</pubDate><guid>https://plumephp.com/go-regexp-input-cleaning-2025/</guid><description>&lt;p&gt;正则表达式很容易让人又爱又怕。它写得好，可以快速从文本里找出订单号、清理多余空白、判断一个字段是否像手机号；写得太贪，就会变成没人敢改的一串符号。Go 的 &lt;code&gt;regexp&lt;/code&gt; 包使用 RE2 语法，避免了某些语言里灾难性回溯的问题，但这不代表正则可以随便写。&lt;/p&gt;</description></item><item><title>Go HTTP 客户端上传文件入门：multipart 请求怎么构造</title><link>https://plumephp.com/go-http-client-multipart-upload-2025/</link><pubDate>Tue, 22 Apr 2025 14:05:00 +0800</pubDate><guid>https://plumephp.com/go-http-client-multipart-upload-2025/</guid><description>&lt;p&gt;前面很多教程会讲服务端如何接收文件上传，但客户端怎么上传也很常见：你的 Go 程序要把图片传给素材服务，把 CSV 传给导入接口，或者把日志包传给诊断系统。这类请求通常使用 &lt;code&gt;multipart/form-data&lt;/code&gt;。标准库可以完成，但写法比普通 JSON 请求稍微长一点。&lt;/p&gt;</description></item><item><title>Go 入门：CSV 导入导出别只会 strings.Split</title><link>https://plumephp.com/go-csv-reading-writing-2025/</link><pubDate>Wed, 12 Mar 2025 10:42:00 +0800</pubDate><guid>https://plumephp.com/go-csv-reading-writing-2025/</guid><description>&lt;p&gt;CSV 是最不起眼、也最容易出事故的数据格式。运营同事从后台导出一份表，财务系统给你一份结算明细，供应商发来一批商品编码，很多时候都是 CSV。初学者常犯的错误是用 &lt;code&gt;strings.Split(line, &amp;quot;,&amp;quot;)&lt;/code&gt; 处理。只要字段里出现逗号、换行或双引号，这个办法马上失效。&lt;/p&gt;</description></item><item><title>Go http.ServeContent 入门：文件下载、修改时间和断点续传</title><link>https://plumephp.com/go-servecontent-downloads-2025/</link><pubDate>Tue, 28 Jan 2025 10:12:00 +0800</pubDate><guid>https://plumephp.com/go-servecontent-downloads-2025/</guid><description>&lt;p&gt;很多 Go 初学者写文件下载接口时，会直接 &lt;code&gt;os.ReadFile&lt;/code&gt; 把文件读进内存，再 &lt;code&gt;w.Write&lt;/code&gt; 返回。文件很小时这样能跑，但报表、日志包、图片、压缩文件一大，就会浪费内存，也错过了 HTTP 已经提供的能力：修改时间、Range 请求、缓存协商、内容长度。标准库的 &lt;code&gt;http.ServeContent&lt;/code&gt; 正是为这类场景准备的。&lt;/p&gt;</description></item></channel></rss>