如何使用网络框架上传 vibe.d 中的文件

how to upload a file in vibe.d using the web framework

我对 Vibe.d 还是个新手,所以如果我遗漏了一些明显的东西,请原谅我。

我想使用 Web 框架在 Vibe.d 中上传文件。但是,我找到的所有示例,包括'D Web Development'一书中的示例,都没有使用 web 框架。如果我将非网络框架示例插入到我的应用程序中,它就会崩溃。如果我仅仅为了一个功能,即文件上传而不得不放弃 Web 框架,那就太糟糕了。

Vibe.d 文档是一项很好的工作,我对此表示赞赏,但直到现在它还相当稀少,而且示例也很少。

以下是我的一些代码片段:

shared static this()
{
    auto router = new URLRouter;
    router.post("/upload", &upload);
    router.registerWebInterface(new WebApp);
    //router.get("/", staticRedirect("/index.html"));
    //router.get("/ws", handleWebSockets(&handleWebSocketConnection));
    router.get("*", serveStaticFiles("public/"));

    auto settings = new HTTPServerSettings;
    settings.port = 8080;
    settings.bindAddresses = ["::1", "127.0.0.1"];
    listenHTTP(settings, router);

    conn = connectMongoDB("127.0.0.1");
    appStore = new WebAppStore;
}

void upload(HTTPServerRequest req, HTTPServerResponse res)
{
    auto f = "filename" in req.files;
    try
    {
        moveFile(f.tempPath, Path("./public/uploaded/images") ~ f.filename);
    }
    catch(Exception e) 
    {
        copyFile(f.tempPath, Path("./public/uploaded/images") ~ f.filename);
    }
    res.redirect("/uploaded");
}

我还能使用网络框架访问 HTTPServerRequest.files 吗?如何?或者我还需要它吗?意思是,有没有不使用 HTTPServerRequest.files 的另一种方法?

非常感谢!

将上传功能放在 WebApp 中 class 并用它来处理表单 post form(action="/upload", method ="post")

class WebApp {

    addUpload(HTTPServerRequest req, ...)
    {
        auto file = file in req.files;
        ...
    }
}

您可以尝试 hunt-framework,Hunt Framework 是一种高级 D 编程语言 Web 框架,它鼓励快速开发和干净、实用的设计。它可以让您快速轻松地构建高性能 Web 应用程序。

操作示例代码:

    @Action
    string upload()
    {
        string message;

        if (request.hasFile("file1"))
        {
            auto file = request.file("file1");

            if (file.isValid())
            {
                // File save path: file.path()
                // Origin name: file.originalName()
                // File extension: file.extension()
                // File mimetype: file.mimeType()

                if (file.store("uploads/myfile.zip"))
                {
                    message = "upload is successed";
                }
                else
                {

                    message = "save as error";
                }
            }
            else
            {
                message = "file is not valid";
            }
        }
        else
        {
            message = "not get this file";
        }

        return message;
    }

我完全忘记了这个问题。我记得当你无法轻易找到一个问题的答案时,对于那些已经知道的人来说似乎是基本的问题是多么令人沮丧。

确保在表单的 enctype 中注明 'multipart/form-data':

form(method="post", action="new_employee", enctype="multipart/form-data")

然后该表单中的字段应包含类型为 'file' 的输入字段,如下所示:

input(type="file", name="picture")

在你的web框架class的postNewEmployee()方法中,通过request.files获取文件:

auto pic = "picture" in request.files;

这是一个传递给 Employee 结构的 postNewEmployee() 方法示例:

void postNewEmployee(Employee emp)
{
    Employee e = emp;
    string photopath = "No photo submitted";
    auto pic = "picture" in request.files;
    if(pic !is null) 
    {
        string ext = extension(pic.filename.name);
        string[] exts = [".jpg", ".jpeg", ".png", ".gif"];
        if(canFind(exts, ext))
        {
            photopath = "uploads/photos/" ~ e.fname ~ "_" ~ e.lname ~ ext;
            string dir = "./public/uploads/photos/";
            mkdirRecurse(dir);
            string fullpath = dir ~ e.fname ~ "_" ~ e.lname ~ ext;
            try moveFile(pic.tempPath, NativePath(fullpath));
            catch (Exception ex) copyFile(pic.tempPath, NativePath(fullpath));
        }
    }
    e.photo = photopath;
    empModel.addEmployee(e);
    redirect("list_employees");
}

当我再次尝试学习Vibe.d时,我再次意识到教程的匮乏,所以我自己写了一个教程,作为一个学习者,一切都是新鲜的:

https://github.com/reyvaleza/vibed

希望你觉得这很有用。