我从 sqlite 数据库检索了二进制数据,现在我有了指向二进制数据 (sqlite3_column_blob) 的指针。如何使用C cgi脚本将这些数据输出到客户端?
char *sql = "SELECT Data FROM Images WHERE Id = 1";
sqlite3_stmt *pStmt;
rc = sqlite3_prepare_v2(db, sql, -1, &pStmt, 0);
if (rc != SQLITE_OK ) {
fprintf(stderr, "Failed to prepare statement\n");
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
rc = sqlite3_step(pStmt);
int bytes = 0;
if (rc == SQLITE_ROW) {
bytes = sqlite3_column_bytes(pStmt, 0);
}
// >>>>next row is function to save file but I want output binary data to client<<<<
fwrite(sqlite3_column_blob(pStmt, 0), bytes, 1, fp);
最佳答案
通用网关接口(interface)是一种较旧形式的 Web 服务器接口(interface)(请参阅此处的 W3 页面 http://www.w3.org/CGI/ ),根据我的内存,Web 服务器将套接字传递给 CGI 应用程序,该应用程序作为子进程启动,我认为这都是 STDIN和标准输出。 CGI 应用程序负责所有 HTTP header 和所有其余内容管理。
因此,您的应用程序需要做的是创建必要的 HTTP header 指令来指示内容类型和其他部分,然后将内容字节作为正文发送。
我想问的一个问题是为什么用 C 语言而不是其他语言(例如 Perl 或 Php)来执行此操作,它们对此类事情有很好的支持?
第一步是获取并处理请求头数据。这可能会有所不同,具体取决于特定的 Web 服务器及其使用的 CGI 功能。过去似乎只是从 STDIN 读取处理 HTTP 请求 header ,一次一个回车符分隔行,直到找到空行。然而,您的特定网络服务器可能提供不同的机制。
HTTP 响应 header 信息通常相当标准,除了内容长度外,大部分内容不会发生变化,内容长度会因图像大小而变化,从而导致发送的字节数变化。我非常确定,过去我实际上忽略了内容长度 HTTP 响应指令,因为向下发送数据然后关闭 socked 表明内容下载已完成。
如果您阅读 IETF RFC 3875 Common Gateway Interface您会看到很多“系统定义”的漏洞,因此您需要做什么取决于您的网络服务器。
这是一个How To for CGI programming with Apache web server .
这篇文章W3 HTTP Header Field Definitions提供有关各种 header 指令的信息。
这个W3 Content-type header field专门提供有关内容类型指令的信息。
这是一个O'Reilly open book on CGI Programming提供基本原理的概述,但它看起来有点旧。
另请查看此问题的答案 stack overflow CGI c file open关于 CGI,其中提到了一些可能有用的库。
关于c - 一个 C cgi 脚本,用于从 sqlite3_column_blob 指针提供二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30709317/