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

问题描述:

我目前使用Pushbullet API并需要上传文件。将文件上传到Windows 10应用程序c中的Pushbullet#

因为使用这种方法在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上传文件的正确方法是什么?

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

让我们来看看document,我们可以在这个例子中找到要求它采用下列参数:

-F [email protected]

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

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

+0

太棒了,它现在有用!谢谢您的帮助 –