从Lua的CGI生成下载文件

时间:2015-04-20 03:48:46

标签: lua cgi

我正在用lua编写一个简单的CGI程序。我想要实现的是从CGI产生一个响应,它允许从浏览器下载文件。但我只是无法打印数据。我不知道这里发生了什么。以下是代码:

print("Content-Type: text/html; charset=UTF-8")
print("Content-Length:" .. sys.getenv("CONTENT_LENGTH"))
print("Content-Disposition:",'attachment;filename="backup.tar.gz"\n')
print("Content-Type:application/x-tar-gz\n\n")
file=io.popen("some command")
output = file:read('*a')
print(output)
--file:close()

问题是我无法打印内容为二进制的输出。我可以看到输出的类型是字符串。

有什么问题?请给出一些提示。谢谢。

ADD :我对此一无所知,问题在哪里。让我提供有关我想要运行的命令的更多信息。但我认为这不重要。

  1. 实际上,我在openwrt,web服务器uhttpd工作。 (这里没有LuCI)
  2. 命令为:sysupgrade -b - 2> / dev / null。此命令用于备份配置文件。我想写一个CGI来从网上下载备份文件。
  3. 但我无法将输出打印到服务器。即使在终端(在lua IDE中)我也无法打印输出,除了一两个凌乱的代码。但我可以将输出写入终端中的文件。也许它与out的内容有一些关系。
  4. 当我逐行打印内容时,会打印一些,但不是全部。我下载文件后。我无法打开它。

1 个答案:

答案 0 :(得分:1)

print("Content-Disposition:",'attachment;filename="backup.tar.gz"\n')
print("Content-Type:application/x-tar-gz\n\n")

我认为你有太多的新行。首先,您可以在Content-Disposition中添加换行符,这是print添加的换行符的补充,它会结束标题并使Content-Type成为有效负载的一部分(这会破坏内容)。您在Content-Type中还有两个换行符,您只需要一个换行符(由print命令添加一个换行符。)

我认为这样的事情应该有效:

local file = io.popen("some command")
local output = file:read('*a')
file:close()
print("Content-Type: text/html; charset=UTF-8")
print("Content-Length: " .. #output)
print("Content-Disposition: " .. 'attachment;filename="backup.tar.gz"')
print("Content-Type: application/x-tar-gz\r\n")
print(output)