通过多部分请求上传文件

时间:2015-04-14 12:05:35

标签: http d

我需要将一个zip文件上传到一个接受多部分请求中传递的文件的URL。 " multipart / form-data"中部件的名称请求绑定到" archive"。

到目前为止我所拥有的:

        auto f = new BufferedFile(<path_to_file>, FileMode.In);
        scope (exit) f.close();

        http = HTTP(<post_url>);
        http.addRequestHeader("Content-Type", "multipart/form-data;boundary=heregoes");
        http.verifyPeer(false);
        http.method = HTTP.Method.post;
        http.onSend = (void[] data){
            return f.read(cast(ubyte[]) data);
        };
        http.contentLength = cast(size_t) f.size;
        http.setCookieJar("<cookie_file_used_for_auth>");
        http.perform();

如何设置密钥&#34; archive&#34;在请求映射文件?

由于

1 个答案:

答案 0 :(得分:0)

我没有多少使用std.net.curl,所以我不知道是否有更简单的方法,但你发送的数据只是网上的一个blob ,所以你可以手动设置其他值。

请勿发送数据,将其放入MIME信封中。我刚才写了这个小班,以帮助形成:

/// Creates a multipart/form-data object that is suitable for file uploads and other kinds of POST
class FormData {
    struct MimePart {
        string name;
        const(void)[] data;
        string contentType;
        string filename;
    }

    MimePart[] parts;

    void append(string key, in void[] value, string contentType = null, string filename = null) {
        parts ~= MimePart(key, value, contentType, filename);
    }

    private string boundary = "0016e64be86203dd36047610926a"; // FIXME

    ubyte[] toBytes() {
        string data;

        foreach(part; parts) {
            data ~= "--" ~ boundary ~ "\r\n";
            data ~= "Content-Disposition: form-data; name=\""~part.name~"\"";
            if(part.filename !is null)
                data ~= "; filename=\""~part.filename~"\"";
            data ~= "\r\n";
            if(part.contentType !is null)
                data ~= "Content-Type: " ~ part.contentType ~ "\r\n";
            data ~= "\r\n";

            data ~= cast(string) part.data;

            data ~= "\r\n";
        }

        data ~= "--" ~ boundary ~ "--\r\n";

        return cast(ubyte[]) data;
    }
}

我知道代码很糟糕,我最近还没有对它进行过测试,但输出的眼球是正确的。它应该像这样工作:

auto data = new FormData();
data.append("archive", "YOUR DATA", "application/octet-stream"); // or whatever mime type you need

auto bytes = data.toBytes();

然后在curl请求时发送字节而不是文件内容。 setPostData的{​​{1}}方法看起来像是放置它的地方。请记住将设置的帖子数据中的内容类型设置为带有边界的multipart / form-data(如果您愿意,可以更改我的课程中的那个)。

http://dlang.org/phobos/std_net_curl.html#setPostData

我知道curl库也有为你做这个的功能......但我不认为高级std.net.curl接口会暴露它们:(