0

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

我可以使用此方法成功获取文档中指定的上传 url :

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 上传文件的正确方法是什么?

4

1 回答 1

2

HTTP 400 error表示Bad Request,表示由于语法错误,服务器无法理解该请求。换句话说,客户端发送的请求不遵循服务器的规则。

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

-F 文件=@cat.jpg

所以在请求中,我们需要为上传的文件设置名称,名称应该是“文件”。此外,在这个请求中,不需要使用访问令牌。所以你可以改变你的代码,如下所示:

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

于 2016-07-25T14:34:05.880 回答