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

推荐订阅源

大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
量子位
A
Arctic Wolf
L
Lohrmann on Cybersecurity
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
WordPress大学
WordPress大学
V
Vulnerabilities – Threatpost
博客园 - Franky
C
Cyber Attacks, Cyber Crime and Cyber Security
The Cloudflare Blog
Last Week in AI
Last Week in AI
The Hacker News
The Hacker News
I
Intezer
J
Java Code Geeks
P
Privacy International News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Secure Thoughts
Cisco Talos Blog
Cisco Talos Blog
阮一峰的网络日志
阮一峰的网络日志
S
Securelist
Security Latest
Security Latest
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
Jina AI
Jina AI
有赞技术团队
有赞技术团队
人人都是产品经理
人人都是产品经理
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
T
The Exploit Database - CXSecurity.com
雷峰网
雷峰网
T
Tenable Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
P
Privacy & Cybersecurity Law Blog
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - 【当耐特】
T
Threat Research - Cisco Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
MongoDB | Blog
MongoDB | Blog
D
DataBreaches.Net
N
News | PayPal Newsroom
Google Online Security Blog
Google Online Security Blog
K
Kaspersky official blog
H
Help Net Security
宝玉的分享
宝玉的分享
罗磊的独立博客
Webroot Blog
Webroot Blog
月光博客
月光博客
B
Blog RSS Feed
Recorded Future
Recorded Future

gankudadiz的个人小站

网页字体: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 服务实际是哪个用户在跑文件",很容易在错误的方向上绕很久。

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