作者:夏山_Els乀i丷e | 来源:互联网 | 2023-05-30 13:26
因此,我用C语言制作了一个Web服务器,该服务器显示传感器温度以及gnuplot以png格式绘制的图形。
我在发送http模板和png图像时遇到问题。我可以将所有数据发送到http模板,但最后不能附加图像。
static const char response_http_template[] = {
"HTTP/1.1 200 OK \
Date: Mon,27 Jul 2009 12:28:53 GMT \
Server: Apache/2.2.14 (Win32) \
Last-Modified: Wed,22 Jul 2009 19:15:56 GMT \
Content-Length: %lu \
Content-Type: text/html \
Connection: Closed \
\n\n \
%s \
%s"
};
static const char response_page_template[] = {
" \
\
\
\
\
\
more html code with some %s
}
void send_response_data(uint32_t sock_client,const char *student_name,last_temp_t *last_temp)
{
char write_buf[8192] = { 0 };
char out_buf[8192] = { 0 };
struct stat filestat;
char filesize[7];
int fd;
char file_buf[1024] = {0};
char result;
FILE *fp;
if ( ((fd = open ("./sup/data.png",O_RDONLY)) <-1) || (fstat(fd,&filestat) <0) ) {
printf ("Error in measuring the size of the file");
}
sprintf (filesize,"%zd",filestat.st_size);
printf("File size %s\n",filesize);
fp = fopen ("./sup/data.png","r");
if (fp == NULL)
{
perror("fopen error");
exit(EXIT_FAILURE);
}
fread(file_buf,sizeof(char),filestat.st_size + 1,fp);
fclose(fp);
sprintf(
write_buf,response_page_template,student_name,last_temp->timestamp,last_temp->temp);
sprintf(out_buf,response_http_template,strlen(write_buf) + strlen(file_buf),write_buf,file_buf);
write(sock_client,out_buf,strlen(out_buf));
}
当我使用chrome启动客户端时,我看到正确的http代码,但未显示图像,仅显示以下文本:``PNG
关于如何发送二进制数据的任何想法?或者,如果我需要更改http模板中的某些内容?
谢谢
这里有两种可能的路径:
- 检查请求URL,然后根据URL发送HTML页面或图像,或者
- 同时使用数据网址
对于选项1,“主”服务器将必须检查URL是否指向/ image /(或其他表示图像的文件夹)。
对于选项#2,使用数据URL(在Google上进行搜索,或查看:https://en.wikipedia.org/wiki/Data_URI_scheme
img src="data:image/png;base64,iVBORw0KGgoAAA
ANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4
//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU
5ErkJggg==" alt="Red dot" />
您将需要base64编码器才能将文件从二进制转换为文本。