在C中显示来自Web服务器的图像

时间:2015-02-27 10:59:57

标签: c image file webserver server

我在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.我仍然错过了一些可能是问题吗?

1 个答案:

答案 0 :(得分:1)

fgets期间,错误可能正在蔓延。 fgets对于阅读文本很有用,但对于二进制数据则没有那么多。改为使用fread,不要愚蠢地寻找最终技巧来找到数据的大小;只读到最后并将数据写入响应。要获取标题文件的大小,请使用statfstat