惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
I
InfoQ
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 【当耐特】
小众软件
小众软件
B
Blog RSS Feed
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
Engineering at Meta
Engineering at Meta
人人都是产品经理
人人都是产品经理
Microsoft Security Blog
Microsoft Security Blog
Last Week in AI
Last Week in AI
H
Help Net Security
爱范儿
爱范儿
云风的 BLOG
云风的 BLOG
博客园 - 司徒正美
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Microsoft Azure Blog
Microsoft Azure Blog
L
LangChain Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
腾讯CDC

gankudadiz的个人小站

Git 忽略文件的几种藏法 - gankudadiz blog 今天试了下 Gemini 3.8 flash,被谷歌的工具线给整不会了 - gankudadiz blog 离职后的自由:带女儿开启人生第一次自驾游(一) - gankudadiz blog 理想主义程序员的告别与告白:看完《年会不能停2》后的职场十年感怀 - gankudadiz blog 网页字体:TTF、WOFF2 和子集化 - gankudadiz blog 一次异常上行排查:揪出一个后台抓包的服务 - gankudadiz blog Opencode Go套餐的API玩法 - gankudadiz blog 本地开发服务, 端口与网络访问基础 - gankudadiz blog PHP 与 Redis:从原理到日常维护 - gankudadiz blog 用 Claude Code 和 Mimo 翻译 Filament 文档的一点记录 2026年了,AI横行的现在,markdown还是文档的主流格式吗? - gankudadiz blog 坚果云同步目录理解错误记录 - gankudadiz blog GitHub Pages 的运作机制与最新规则 - gankudadiz blog 不是,没人和我说这么感人啊 - gankudadiz blog OpenCode 配置 Oh My OpenAgent(OMO) 记录 装了ccusage,总算知道 Claude Code 和 Codex 吃了多少 token --一切尽在 Everything - gankudadiz blog 女儿第一次国际象棋团队赛 - gankudadiz blog AI的积极意义---用GPT-image2制作女儿单词卡 - gankudadiz blog 这个时代要变了 GPT-image2使用感想 - gankudadiz blog 再见,大布 - gankudadiz blog 关于 MySQL 整数显示宽度的排查:为什么同一张表会出现 `bigint(20) unsigned` 和 `bigint unsigned` 做博客几个月,我终于了解了这些站长工具 - gankudadiz blog 博客的未来规划 - gankudadiz blog 给评论区加个草稿箱:sessionStorage 的标签页级缓存 - gankudadiz blog WSL2和Windows同步claude code配置记录 - gankudadiz blog WSL2 安装 Claude Code 全攻略 给博客加上异步邮件通知:Laravel Queue 实践小记 - gankudadiz blog
头像上传裁剪这件小事 - gankudadiz blog
2026-04-01 · via gankudadiz的个人小站

今天给博客加了个头像上传裁剪功能,本来以为挺简单的,结果还是踩了个小坑。

需求很明确:上传一张头像,然后裁剪成几个常用尺寸。不算复杂,用的是 intervention/image 这个库来处理图片裁切。

代码写完本地测试没问题,一部署到服务器就不行了。上传之后图片就是生成不出来,也不报错,就是静默失败。

开始怀疑是代码问题。看了一圈上传逻辑,又看了裁切代码,感觉都没毛病。然后开始看日志,发现有一段:

Unable to retrieve file_size for file at location...

看到这个就有点懵,觉得是不是临时文件处理有问题。改了一版上传逻辑,不走框架的临时文件机制,直接从真实路径读内容再写入:

$contents = file_get_contents($file->getRealPath());
$disk->put($filename, $contents);

这样确实稳了一点,但还是没解决根本问题。

最后是怎么发现的呢?去看了一下服务器上目录的权限。

目标目录是 755,看起来没问题。但仔细一看所有者:root。而项目其他目录是 755 www

问题就在这。755 的意思是所有者可写。如果 Web 服务用 www 用户跑,那它面对 755/root 的目录,其实是写不进去的。

这就是为什么"权限看着没问题",上传却一直失败。

解决也很朴素:

chown -R www:www [头像目录]

改完之后就好了,头像原图和各种尺寸都能正常生成。

这事让我想到,很多人排查上传失败会先看代码、看配置、看目录存不存在,但如果不搞清楚"Web 服务实际是哪个用户在跑文件",很容易在错误的方向上绕很久。

上传归根结底是个写文件的操作,最后还是得回到最原始的问题:这个进程有没有权限往这个目录里写东西。