在Windows 10应用程序中将文件上传到Pushbullet c#

时间:2016-07-22 17:01:10

标签: c# uwp windows-10-universal pushbullet

我目前正在使用Pushbullet API并需要上传文件。

我可以使用此方法成功获取docs中指定的上传网址:

public static async Task<Uploads> GetUploadUrl(string file_name, string file_type)
    {
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Add("Access-Token", AccessToken);

            var json = new JObject
            {
                ["file_name"] = file_name,
                ["file_type"] = file_type
            };

            var result = await client.PostAsync(new Uri(_uploadUrl, UriKind.RelativeOrAbsolute), new HttpStringContent(json.ToString(), UnicodeEncoding.Utf8, "application/json"));
            if (result.IsSuccessStatusCode)
            {
                var textresult = await result.Content.ReadAsStringAsync();
                return JsonConvert.DeserializeObject<Uploads>(textresult);
            }
        }

        return null;
    }

问题是当我尝试上传文件时。我目前正在使用这种方法:

 public static async Task<bool> UploadFile(StorageFile file, string upload_url)
    {
        try
        {
            System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
            var content = new MultipartFormDataContent();
            if (file != null)
            {
                var streamData = await file.OpenReadAsync();
                var bytes = new byte[streamData.Size];
                using (var dataReader = new DataReader(streamData))
                {
                    await dataReader.LoadAsync((uint)streamData.Size);
                    dataReader.ReadBytes(bytes);
                }
                var streamContent = new ByteArrayContent(bytes);
                content.Add(streamContent);
            }
            client.DefaultRequestHeaders.Add("Access-Token", AccessToken);
            var response = await client.PostAsync(new Uri(upload_url, UriKind.Absolute), content);
            if (response.IsSuccessStatusCode)
                return true;
        }
        catch { return false; }

        return false;
    }

但是我收到了Http 400错误。在UWP应用中使用multipart / form-data上传文件的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

HTTP 400 error表示错误请求,这意味着由于语法格式错误,服务器无法理解请求。换句话说,客户端发送的请求并不遵循服务器的规则。

让我们看看document,我们可以在示例请求中找到它使用以下参数:

  

-F file=@cat.jpg

因此,在请求中,我们需要为上传的文件设置名称,名称应为&#34; file&#34;。此外,在此请求中,不需要使用访问令牌。所以你可以改变你的代码如下:

public static async Task<bool> UploadFile(StorageFile file, string upload_url)
{
    try
    {
        System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
        var content = new MultipartFormDataContent();
        if (file != null)
        {
            var streamData = await file.OpenReadAsync();
            var bytes = new byte[streamData.Size];
            using (var dataReader = new DataReader(streamData))
            {
                await dataReader.LoadAsync((uint)streamData.Size);
                dataReader.ReadBytes(bytes);
            }
            var streamContent = new ByteArrayContent(bytes);
            content.Add(streamContent, "file");
        }
        //client.DefaultRequestHeaders.Add("Access-Token", AccessToken);
        var response = await client.PostAsync(new Uri(upload_url, UriKind.Absolute), content);
        if (response.IsSuccessStatusCode)
            return true;
    }
    catch { return false; }

    return false;
}

然后你的代码应该可以工作了。您将收到204 No Content响应,UploadFile方法将返回true