我在C上编写Web服务器。我能够查看HTML和txt文件但是我无法查看图像文件。
我得到的只是一个错误"图片“http://localhost:8080/images/image.jpg”无法显示,因为它包含错误。"
if(strstr(method, "GET") != NULL)
{
f = fopen(url+1, "rb");
if(f != NULL)
{
strncat(response, "HTTP/1.1 200 OK\r\n", 20);
if(strstr(url, ".html") || strstr(url, ".htm"))
{
strncat(response, "Content-Type: text/html\r\n\r\n", 30);
}
else if(strstr(url, ".txt"))
{
strncat(response, "Content-Type: text/plain\r\n\r\n", 30);
}
else if(strstr(url, ".jpg") || strstr(url, ".jpeg"))
{
strncat(response, "Content-Type: image/jpeg\r\n\r\n", 30);
}
filesize = stat(url+1, &st);
filesize = st.st_size;
strncat(response, "Content-Length: 67210\r\n\r\n", 40);
while(fread(text,1 , 1, f))
{
strncat(response, text, filesize);
}
printf("%d\n", strlen(text));
printf("%d\n", strlen(response));
write(client_fd, response, strlen(response)); /*-1:'\0'*/
fclose(f);
}
else
{
write(client_fd, not_found_response, strlen(not_found_response)); /*-1:'\0'*/
}
}
else
{
write(client_fd, bad_request_response, strlen(bad_request_response)); /*-1:'\0'*/
}
close(client_fd);
}
编辑:我已根据以下建议编辑了我的代码。但是我仍然遇到同样的问题。我检查了文件大小,它是67210但是当我做strlen(响应)时我只得到66882.我仍然错过了一些可能是问题吗?
答案 0 :(得分:1)
在fgets
期间,错误可能正在蔓延。 fgets
对于阅读文本很有用,但对于二进制数据则没有那么多。改为使用fread
,不要愚蠢地寻找最终技巧来找到数据的大小;只读到最后并将数据写入响应。要获取标题文件的大小,请使用stat
或fstat
。