0

我想知道如何将内容标题添加到 flurl 语句中。onedrive 实现要求我向内容添加内容类型标头,并尝试了所有可能的解决方案,但没有成功。

我被迫使用带有以下代码的常规 httpclient。

Public Async Function UploadFile(folder As String, filepath As String) As Task(Of Boolean) Implements ICloud.UploadFile
        Dim data As Byte() = File.ReadAllBytes(filepath)
        Dim uploadurl As String = "drive/items/" + folder + ":/" + Path.GetFileName(filepath) + ":/" + "content?access_token=" + Token.access_token


        Using client As New HttpClient()
            client.BaseAddress = New Uri(ApiUrl)

            Dim request As HttpRequestMessage = New HttpRequestMessage(HttpMethod.Put, uploadurl)

            request.Content = New ByteArrayContent(data)
            request.Content.Headers.Add("Content-Type", "application/octet-stream")
            request.Content.Headers.Add("Content-Length", data.Length)

            Dim response = Await client.SendAsync(request)

            Return response.IsSuccessStatusCode
        End Using
    End Function

我已经尝试过 Flurl 的常规 PutJsonAsync 方法,但没有运气。这是我的代码中剩下的唯一非 Flurl 部分。

提前谢谢。

4

1 回答 1

3

这里真正的问题是目前在 Flurl 中没有对发送流或字节数组的开箱即用支持。我计划很快添加一些,但是有了你已经拥有的实现细节,你可以很容易地用扩展方法自己添加它。(原谅C#,希望你能翻译成VB。)

public static Task<HttpResponseMessage> PutFileAsync(this FlurlClient client, string filepath) 
{
    var data = File.ReadAllBytes(filepath);
    var content = new ByteArrayContent(data);
    content.Headers.Add("Content-Type", "application/octet-stream");
    content.Headers.Add("Content-Length", data.Length);
    return client.SendAsync(HttpMethod.Put, content: content);
}

如果您已经有 ,则上述方法有效FlurlClient,但正如文档string所描述的那样,拥有相应的和扩展是一个好主意Url,它可以委托给上述方法:

public static Task<HttpResponseMessage> PutFileAsync(this Url url, string filepath)
{
    return new FlurlClient(url).PutFileAsync(filepath);
}

public static Task<HttpResponseMessage> PutFileAsync(this string url, string filepath)
{
    return new FlurlClient(url).PutFileAsync(filepath);
}

把它们塞进一个静态辅助类中,它们应该可以与 Flurl 无缝协作:

await uploadurl.PutFileAsync(filepath)
于 2015-09-28T19:30:33.223 回答