2 个版本

使用旧的 Rust 2015

0.3.1 2016年1月6日
0.3.0 2016年1月6日

#13 in #iron-framework

每月21次下载
rstatic 中使用

自定义许可证

17KB
192 代码行

staticdir

Iron 网页框架提供目录内容。文档可在 此处 找到。

目的

提供挂载文件夹中的文件和目录列表。要使用文件响应,请与 staticfile 一起使用此功能。请参阅示例。

示例

https://127.0.0.1:3000 上启动网页服务器并挂载当前目录。目录内容列表将以 JSON 格式可用。

extern crate staticdir;
extern crate iron;

use iron::prelude::*;
use staticdir::{ StaticDir, AsJson };

fn main() {
    Iron::new(StaticDir::new(".", AsJson)).http("localhost:3000").unwrap();
}

此代码将返回您

[
  {
    "file_type": "File",
    "file_name": ".gitignore",
    "size": 7,
    "creation_time": null,
    "last_modification_time": 1451939290,
    "last_access_time": 1451939309
  },
  {
    "file_type": "File",
    "file_name": "Cargo.toml",
    "size": 196,
    "creation_time": null,
    "last_modification_time": 1451939547,
    "last_access_time": 1451939547
  },
  {
    "file_type": "Dir",
    "file_name": "src",
    "size": 4096,
    "creation_time": null,
    "last_modification_time": 1451939462,
    "last_access_time": 1451939462
  }
]

自定义行为

您可以使用 ResponseStrategy 特性来自定义响应。假设您需要一个 HTML 响应而不是 JSON

extern crate staticdir;
extern crate iron;

use iron::prelude::*;
use iron::status::Status;
use staticdir::{ StaticDir, ResponseStrategy };
use std::fs::ReadDir;
use iron::mime::Mime;

struct AsHtml;

fn build_html(dir: ReadDir) -> String {
    let mut html = String::new();
    for entry in dir {
        let entry = entry.unwrap();
        html = format!("{}<li>{}</li>", html, entry.file_name().into_string().unwrap());
    }
    format!("<ul>{}</ul>", html)
}

impl ResponseStrategy for AsHtml {
    fn make_response(&self, dir: ReadDir) -> IronResult<Response> {
        let html = build_html(dir);
        let content_type = "text/html; charset=utf-8".parse::<Mime>().unwrap();
        Ok(Response::with((Status::Ok, html, content_type)))
    }
}

fn main() {
    Iron::new(StaticDir::new(".", AsHtml)).http("localhost:3000").unwrap();
}

这将返回一个包含以下内容的 HTML 页面

* Cargo.toml
* src
* .git

与 iron 组件一起工作

您可以使用 iron 核心组件 的其他模块,如 staticfilemount。在下一个示例中,您将收到目录列表和静态文件。

extern crate staticdir;
extern crate iron;
extern crate mount;
extern crate staticfile;

use iron::prelude::*;
use mount::Mount;
use staticdir::{ StaticDir, AsJson };
use staticfile::Static;


fn main() {
    let root = "tests/mount";
    let mut handle_statics = Chain::new(Static::new(root));
    handle_statics.link_after(StaticDir::new(root, AsJson));

    let mut mount = Mount::new();
    mount.mount("/static/", handle_statics);
    let mut server = Iron::new(mount).http("localhost:3000").unwrap();
}

依赖项

~7MB
~155K SLoC