我安装了nginx,旨在提供照片和视频等静态文件,能够以编程方式列出所提供的文件。
问题是此列表是在HTML页面中完成的,对于我的应用程序,我需要能够处理此列表(类似于json或xml)。
无论如何我能用nginx做到这一点吗? (或者还有其他解决方案可以解决我的问题)
提前致谢。
答案 0 :(得分:4)
从版本1.7.9开始,您可以将autoindex_format
设置为json
或xml
,请参阅the docs here。
location / {
...
autoindex on;
autoindex_format json;
}
答案 1 :(得分:2)
自版本1.7.9(2014-12-23发布)以来NGINX 中包含的ngx_http_autoindex_module模块(生成以斜杠字符结尾的请求的目录列表:/
)< / em>添加了autoindex_format
directive 设置目录列表的格式:
语法:
autoindex_format
html | xml | json | jsonp;
默认值:autoindex_format html
;
上下文:http, server, location
示例配置启用此功能(对于JSON):
location / {
autoindex on;
autoindex_format json;
}
当使用JSONP格式时,使用callback
请求参数设置回调函数的名称。 如果该参数缺失或者值为空,则返回JSON格式。
JSON(P)响应数据结构(方案)定义为:
callback( // when format directive jsonp AND callback argument in request
[ // a single one-dimensional Array (wrap) containing
{ // Objects representing directory entries, structured as:
"name" :"*" //String
, "type" :"directory"|"file"|"other" //String, ONLY 1 OF THESE 3
, "mtime":"Ddd, DD Mmm YYYY hh:mm:ss GMT" //String, RFC1123-date of HTTP-date defined by RFC2616
, "size" :* //Integer, ONLY PRESENT IFF "type":"file" !!!!!
} /*
, { // and repeating the above Object structure for each directory entry
} */
]
); // end callbackFunction-call when jsonp
"name"
,"mtime"
,"type":"directory"
和"type":"file"
应该是不言自明的。
重要注意"size"
字段仅出现IFF "type":"file"
,否则将完全省略(请参阅下面的示例)!!
"type":"other"
值得进一步解释:
假设您做了一些从未在生产中做过并在Linux系统上的配置中设置'root /;'
并随后索引/dev/
然后您获取目录 - 例如:
[
{ "name":"floppy", "type":"other", "mtime":"Mon, 23 Oct 2017 15:16:56 GMT" },
{ "name":"loop0", "type":"other", "mtime":"Mon, 23 Oct 2017 15:16:56 GMT" }
// and so forth
]
"type":"other"
还有其他例子,如果你知道的话,请发表评论!
特殊的点 - 当前/点 - 父(.
,..
)和点文件/点文件夹(.hidden
)被过滤(不是现在)在回复中!
有趣的是:特殊的点 - 当前/点 - 父(.
,..
)可以由您的客户端代码添加,就像ngx_http_autoindex_module
已将它们硬编码为默认的html格式响应一样。
这是两个&#39; raw&#39;回复示例的原始&#39;格式&#39;
注意:响应行结尾被硬编码为CRLF
。
JSON(以及没有回调的JSONP):
[
{ "name":"subdir", "type":"directory", "mtime":"Tue, 24 Oct 2017 16:16:16 GMT" },
{ "name":"image.jpg", "type":"file", "mtime":"Tue, 24 Oct 2017 16:16:39 GMT", "size":5 },
{ "name":"test.html", "type":"file", "mtime":"Tue, 24 Oct 2017 16:09:18 GMT", "size":5 }
]
JSONP(回调= foo):
注意:前导块注释是JSONP响应的一部分。
/* callback */
foo([
{ "name":"subdir", "type":"directory", "mtime":"Tue, 24 Oct 2017 16:16:16 GMT" },
{ "name":"image.jpg", "type":"file", "mtime":"Tue, 24 Oct 2017 16:16:39 GMT", "size":5 },
{ "name":"test.html", "type":"file", "mtime":"Tue, 24 Oct 2017 16:09:18 GMT", "size":5 }
]);
一个痛苦的简单片段,它使用JSONP回调并构建一个HTML表,旨在明确地阐明格式:
<script>
function foo(d){
var i= 0
, L= d.length
, r= '<table border="1" cellpadding="4px" style="border-collapse:collapse"><thead style="border-bottom:4px solid black">\n'
+ '<tr><th style="width:80%">Name</th><th>Type</th><th>Last Modified</th><th>Size</th></tr>\n'
+ '</thead><tbody>\n'
;
for(;i<L;++i)
r+= '<tr><td>' + d[i].name
+ '</td><td>' + d[i].type
+ '</td><td style="white-space: nowrap">' + d[i].mtime
+ '</td><td>' + (d[i].type==='file' ? d[i].size : '-')
+ '</td></tr>\n';
r+='</tbody></table>';
document.body.innerHTML=r;
}
</script>
<script> // JSONP Use your own preferred JSON(P) fetchmethod
/* callback */
foo([
{ "name":"subdir", "type":"directory", "mtime":"Tue, 24 Oct 2017 16:16:16 GMT" },
{ "name":"image.jpg", "type":"file", "mtime":"Tue, 24 Oct 2017 16:16:39 GMT", "size":5 },
{ "name":"test.html", "type":"file", "mtime":"Tue, 24 Oct 2017 16:09:18 GMT", "size":5 },
{ "name":"????", "type":"other", "mtime":"Tue, 24 Oct 2017 16:17:52 GMT" }
]);
</script>
&#13;
这意味着从这里开始,您可以对客户端的结果进行过滤和排序。您也可以根据文件类型/扩展名等链接图标。
让它像你一样疯狂,祝你好运!
可以在以下网站找到一些额外的灵感:
来源:
答案 2 :(得分:0)
通过向服务器添加php脚本来列出文件来解决问题。