如何使用网络框架上传 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
希望你觉得这很有用。
我对 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
希望你觉得这很有用。