c - 一个 C cgi 脚本,用于从 sqlite3_column_blob 指针提供二进制文件

标签 c sqlite cgi blob

我从 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/

相关文章:

java - 将程序连接到 SQLite 数据库

perl - CGI 脚本中的纯文本密码是安全漏洞吗?

c - 限制 Web 应用程序的请求大小

c - 子分组算法

c - 为什么这个运算等于1?

c - 字符串操作库

swift - 如何在 FluentProvider for Vapor 中使用字符串化 UUID 作为主键 - Swift

sqlite - 自动增量列会记住其在SQLite表中的最后一个值

ubuntu - sleep 和时钟方法

c++ - 调试 cgi c++ 应用程序