首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有vibe.d的多部分表单数据

具有vibe.d的多部分表单数据
EN

Stack Overflow用户
提问于 2019-09-28 23:28:25
回答 2查看 96关注 0票数 0

我试图提交一个包含有vibe.d图像的多部分表单

我的代码如下所示:

代码语言:javascript
复制
    auto f = File("image.jpg");
    auto data = new char[f.size];
    f.rawRead(data);

    string boundary = randomUUID.toString.toUpper();

    string h = "--Boundary-" ~ boundary ~ "\r\n";
    h ~= `Content-Disposition: form-data; name="type"` ~ "\r\n\r\n";
    h ~= "photo\r\n";
    h ~= "--Boundary-" ~ boundary ~ "\r\n";
    h ~= `Content-Disposition: form-data; name="photo"; filename="558704D0-2855-4689-996C-F556BE4A3872.jpg"` ~ "\r\n";
    h ~= "Content-Type: image/jpeg\r\n\r\n";
    h ~= data ~ "\r\n";
    h ~= "--Boundary-" ~ boundary ~ "\r\n";
    h ~= `Content-Disposition: form-data; name="photo_ids"` ~ "\r\n\r\n";
    h ~= `["55227F15-36D2-4A04-A4D9-FB23C00627D1"]` ~ "\r\n";
    h ~= "--Boundary-" ~ boundary ~ "\r\n";


    auto response = requestHTTP("https://httpbin.org/anything", (scope req) {
        req.method = HTTPMethod.POST;
        req.headers["content-type"] = "multipart/form-data; boundary=Boundary-" ~ boundary;
        req.headers["content-length"] = to!string(h.length);

        req.bodyWriter.write(h);
    }).bodyReader.readAllUTF8();

    logInfo(response);

但是httpbin告诉我我什么也没发:

代码语言:javascript
复制
[main(----) INF] {
[main(----) INF]   "args": {},
[main(----) INF]   "data": "",
[main(----) INF]   "files": {},
[main(----) INF]   "form": {},
[main(----) INF]   "headers": {
[main(----) INF]     "Accept-Encoding": "gzip, deflate",
[main(----) INF]     "Content-Length": "58038",
[main(----) INF]     "Content-Type": "multipart/form-data; boundary=Boundary-76CCC942-83EB-4339-BB6B-2C7D5BF027B6",
[main(----) INF]     "Host": "httpbin.org",
[main(----) INF]     "User-Agent": "vibe.d/1.7.0 (HTTPClient, +http://vibed.org/)"
[main(----) INF]   },
[main(----) INF]   "json": null,
[main(----) INF]   "method": "POST",
[main(----) INF]   "origin": "",
[main(----) INF]   "url": "https://httpbin.org/anything"
[main(----) INF] }

我不知道我做错了什么。会很感激你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-28 23:43:01

您的多部分数据格式错误。对于最后一个边界,您必须附加一个"--“字符串来表示结束。所以,而不是上一次

代码语言:javascript
复制
h ~= "--Boundary-" ~ boundary ~ "\r\n";

它必须是

代码语言:javascript
复制
h ~= "--Boundary-" ~ boundary ~ "--\r\n";`

然后它就能工作了。

请参阅https://www.freesoft.org/CIE/RFC/1521/16.htm

最终,这应该作为vibe.d中的API来支持,并且有两个打开的PRs来实现这个功能,但是现在您必须像以前一样对它进行处理。

票数 0
EN

Stack Overflow用户

发布于 2021-03-14 16:17:31

现在Vibe.d的当前版本大大简化了它。

请确保在表单的封装类型中声明“多部分/表单-数据”:

代码语言:javascript
复制
form.form-grid(method="post", action="new_employee", enctype="multipart/form-data")

然后,该形式的字段应该包含一个类型为“file”的输入字段,如下所示:

代码语言:javascript
复制
input(type="file", name="picture")

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

代码语言:javascript
复制
auto pic = "picture" in request.files;

下面是正在传递一个Employee结构的示例postNewEmployee()方法:

代码语言:javascript
复制
void postNewEmployee(string _authUser, Employee e)
{
    import std.file;
    import std.path;
    import std.algorithm;
    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;
    if(e.phone.length == 0) e.phone = "(123) 456 7890";
    if(e.paygd.length == 0) e.paygd = "none yet";
    if(e.postcode.length == 0) e.postcode = "A1A 1A1";
    e.pword = createDigestPassword(realm, e.email, e.pword);
    empModel.addEmployee(e);
    redirect("list_employees");
}

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

https://github.com/reyvaleza/vibed

希望你觉得这个有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58151043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档