C语言开发Web服务器时fread读取图片异常,其他文件正常如何解决
问题原因
- 文件打开模式错误
你使用fopen(fullpath, "r")以文本模式打开文件,文本模式在Windows环境下会做两个特殊处理:遇到换行符\n(字节值0x0A)会自动替换为\r\n(字节值0x0D 0x0A),遇到终止符\x1A会直接判定为文件结束、停止后续读取。图片属于二进制文件,内部包含所有可能的字节值,这两个处理都会直接破坏图片的原始字节数据,而纯文本文件内部不会出现\x1A这类控制字符,所以读取不受影响。 - 字符串拼接函数不适用二进制内容
你使用strncat函数拼接读取到的文件内容,这类C标准库字符串函数的逻辑是遇到\0(字节值0x00)就判定为字符串结束,停止后续拼接操作。图片文件内部存在大量\0字节,会导致拼接后的响应仅包含第一个\0之前的内容,后面的图片数据全部丢失。纯文本文件不存在\0字节,所以可以完整拼接。 - 可选优化缺失(非核心报错原因)
你没有在响应头中添加Content-Length字段指定返回内容的长度,部分浏览器在处理二进制响应时会因为无法确认数据结束位置出现解析异常。
修复方案
- 将
fopen的打开模式改为二进制只读模式"rb",避免系统自动转义字节。 - 不要使用字符串拼接函数处理二进制内容,改用
memcpy直接拷贝字节数据,示例逻辑如下:
// 先写入响应头,补充Content-Length字段 int header_len = sprintf(header, "HTTP/1.1 200 OK\r\nContent-Type: %s\r\nContent-Length: %d\r\n\r\n", contentType, fileSize); // 直接拷贝二进制内容到响应头后面的位置 memcpy(header + header_len, contentBuffer, fileSize);
- 后续发送响应时,发送的总长度为
header_len + fileSize,不要用strlen计算响应长度,否则依然会被\0截断。
内容的提问来源于stack exchange,提问作者zgast
相关产品推荐
相关产品推荐

