我的网站程序上传到虚拟主机图片文件被破坏

  1. AutoCMS
  2. /
  3. 建站资讯
  4. /
  5. 网站
logo
安青娅

网站  2026-10-27 04:48:01   401

我的网站程序上传到虚拟主机图片文件被破坏

本地测试一切正常,图片在浏览器里显示完整,可一上传到虚拟主机就出问题:有的图只显示上半截,有的直接裂图,还有的文件大小从187KB变成187.6KB,下载回来用看图软件打不开。这种情况我遇到过不止一次,多数不是主机“把图片弄坏了”,而是传输或处理环节出了岔子。

先查文件本身有没有变。把虚拟主机上的图片下载到本地,和原图比大小、比MD5。如果大小差几十到几百字节,MD5完全不同,基本可以锁定FTP传输模式。FTP有ASCII和二进制两种模式,ASCII模式会把换行符CR/LF做转换,文本文件没事,JPEG、PNG、GIF这些二进制文件被转换后文件头就废了。很多FTP工具默认“自动”,对常见图片扩展名会走二进制,但有些虚拟主机自带FTP代理,或者老版本工具识别不准,仍按ASCII传。解决很简单:在FTP客户端里把传输模式强制改成二进制,重新上传覆盖。我那张187,432字节的JPEG,用ASCII传上去变成187,600字节,多出的168字节就是换行符转换的痕迹,改二进制后大小和MD5都对上了,图片立刻正常。

如果文件大小没变但打不开,看文件头。JPEG开头是FF D8 FF,PNG是89 50 4E 47,GIF是47 49 46 38。用十六进制编辑器或在线工具看一眼,文件头不对说明上传时就被改写。虚拟主机控制面板里常有“文件管理器”上传功能,部分老面板对二进制处理也有问题,尽量用FTP二进制模式或SFTP。

另一个常见坑是压缩包上传后在线解压。把几百张图打包成zip传上去,主机解压出来有的图0字节,有的只剩一半。原因可能是压缩包本身在上传时损坏,或者主机解压程序对中文文件名、大文件支持差。先核对压缩包MD5,再在本地解压确认无误;上传后看解压日志,别只看“解压成功”。如果主机支持SSH,用unzip命令解压更稳。没有SSH就分卷压缩,单包控制在主机限制以内,比如50MB以下。

网站后台传图失败也会留下坏文件。PHP默认upload_max_filesize是2M,post_max_size是8M,虚拟主机常把单文件限制在2MB到10MB。传一张5MB的图,前端可能提示成功,实际只写入了一部分,文件大小不对,打开就是破图。查php.ini或主机面板的PHP设置,把upload_max_filesize和post_max_size调大,同时确认max_execution_time够用。上传后立刻用getimagesize()检查,返回false就说明文件不完整。

图片压缩或WebP转换插件也会背锅。WordPress装过自动压缩插件,主机没开GD库或Imagick,插件生成缩略图时写出0字节文件,原图没事,页面调用的缩略图裂了。进媒体库看原图是否正常,再看缩略图。关掉插件重新生成,或者让主机开启对应扩展。有些主机装mod_pagespeed,会自动改写图片,缓存没清时返回截断内容,清缓存或关掉模块再试。

磁盘配额和inode满同样会造成上传中断。虚拟主机面板一般显示磁盘使用量,传大图时超配额,FTP会报错但有时只传了一半。看面板配额,清理旧备份和日志。文件权限不对不会改内容,但会导致403或无法读取,图片显示裂图,权限设成文件644、目录755。

排查顺序可以这样:下载远程图对比MD5和大小;看文件头;强制FTP二进制重传;检查压缩包和解压;查PHP上传限制;关图片处理插件和CDN缓存;最后看主机配额和权限。多数问题在前两步就能定位。实在找不到,把本地原图、远程坏图、FTP日志一起发给主机商,让他们查传输层有没有代理改写。别一上来就重装程序,图片损坏和程序代码关系不大,先盯文件传输和主机环境。