2016-07-22 5 views
0

私は現在Pushbullet APIを使用しており、ファイルをアップロードする必要があります。Windows 10のアプリでPushbulletにファイルをアップロードするC#

docsに指定されている私は正常にこのメソッドを使用してアップロード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アプリケーションでマルチパート/フォームデータを使用してファイルをアップロードする正しい方法は何ですか?

答えて

2

HTTP 400 errorであることを示しています。不正要求は、不正な構文のために要求がサーバーによって理解できないことを意味します。つまり、クライアントから送信されたリクエストはサーバーのルールに従いません。

それは次のパラメータを使用して要求するのは、documentを見てみましょう、と私たちは一例で見つけることができます。

-F [email protected]

のでリクエストに、私たちが必要アップロードされたファイルの名前を設定し、名前は "file"でなければなりません。また、この要求では、アクセストークンを使用する必要はありません。したがって、次のようにコードを変更することができます:

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

素晴らしいです。助けてくれてありがとう –

関連する問題