我们正在开发openwrt。 Web服务器使用lighttpd。 cgi是用C语言开发的。 在html表单中,将动作设置为form标签中的cgi,并执行用C开发的cgi。 我将脚本放在cgi中。
CREATE OR REPLACE FUNCTION writeappend(oid, text)
RETURNS void AS $$
DECLARE
content bytea;
fd int;
BEGIN
content := convert_to($2, getdatabaseencoding());
fd := lo_open($1, 131072);
PERFORM lo_lseek(fd, 0, 2);
IF length(content) <> lowrite(fd, content) THEN
RAISE EXCEPTION 'not all content was written';
END IF;
PERFORM lo_close(fd);
END;
$$ LANGUAGE plpgsql;
postgres=> select lo_creat(-1);
┌──────────┐
│ lo_creat │
╞══════════╡
│ 20653 │
└──────────┘
(1 row)
postgres=> select writeappend(20653, e'Hello\r\n');
┌─────────────┐
│ writeappend │
╞═════════════╡
│ │
└─────────────┘
(1 row)
postgres=> select writeappend(20653, e'Hello\r\n');
...
postgres=> select convert_from(lo_get(20653),getdatabaseencoding());
┌──────────────┐
│ convert_from │
╞══════════════╡
│ Hello\r ↵│
│ Hello\r ↵│
│ │
└──────────────┘
(1 row)
}
在Chrome中运行cgi后,该脚本将无法运行。 这就是我在网页上看到的。 net.bridge.bridge-nf-call-custom = 0 运行命令错误 好 好 好 内容类型:文本/纯文本; charset = utf-8
int main(int argc, char *argv[]){
char *form, *inStr;
long inLen;
printf("Content-type: text/html%c%c\n\n",10,10);
printf("<HTML>\n");
printf("<head>\n");
inLen = strtol(getenv("CONTENT_LENGTH"), NULL, 10) + 1;
inStr = malloc(inLen);
memset(inStr, 0, inLen);
fgets(inStr, inLen+1, stdin);
form = web_get("page", inStr, 0);
if (!strcmp(form, "reboot")) {
set_reboot(inStr);
printf("scriptype='text/javascript'>document.location.href='../index.shtml';/script>\n");
}else if (!strcmp(form,"lan"))
{
set_lan(inStr);
}
free(inStr);
printf("</head>\n");
printf("</HTML>");
return 0;
我没有转到我想要的页面。
答案 0 :(得分:0)
这是因为您执行此行:
printf("Content-type: text/html%c%c\n\n",10,10);
放在上一行之后的任何内容都不会执行,而是打印在屏幕上。问题出在这个脚本的流程中。仅在完成所有其他操作之后,才必须开始打印页面。