2014-10-21 4 views
1

Я пытаюсь использовать Convertapi в приложении App Store для Windows, и я хочу отправить файл .docx и получить pdf-файл взамен, я пытаюсь сделать сообщение, но я не уверен, как его сделано, это то, что я до сих пор, но его не работает.Использование convertapi в приложении для Windows Store

private async Task GeneratePdfContract(string path) { 
try { 
    var data = new List < KeyValuePair < string, string >> { 
      new KeyValuePair < string, string > ("Api", "5"), 
       new KeyValuePair < string, string > ("ApiKey", "419595049"), 
       new KeyValuePair < string, string > ("File", "" + stream2), 

     }; 

    await PostKeyValueData(data); 

} catch (Exception e) { 

    Debug.WriteLine(e.Message); 
} 

}

private async Task PostKeyValueData(List < KeyValuePair < string, string >> values) { 
var httpClient = new HttpClient(); 
var response = await httpClient.PostAsync("http://do.convertapi.com/Word2Pdf", new FormUrlEncodedContent(values)); 
var responseString = await response.Content.ReadAsStringAsync(); 

}

Как я должен сделать свой пост, чтобы послать .docx файл и получить файл .pdf взамен?

Edit:

private async Task GeneratePdfContract(string path) 
    { 
     try 
     { 
      using (var client = new System.Net.Http.HttpClient()) 
      { 
       using (var multipartFormDataContent = new MultipartFormDataContent()) 
       { 
        var values = new[] 
     { 
      new KeyValuePair<string, string>("ApiKey", "413595149") 
     }; 

        foreach (var keyValuePair in values) 
        { 
         multipartFormDataContent.Add(new StringContent(keyValuePair.Value), String.Format("\"{0}\"", keyValuePair.Key)); 
        } 

        StorageFolder currentFolder = await ApplicationData.Current.LocalFolder.GetFolderAsync(Constants.DataDirectory); 

        StorageFile outputFile = await currentFolder.GetFileAsync("file.docx"); 

        byte[] fileBytes = await outputFile.ToBytes(); 


        //multipartFormDataContent.Add(new ByteArrayContent(FileIO.ReadBufferAsync(@"C:\test.docx")), '"' + "File" + '"', '"' + "test.docx" + '"'); 

        multipartFormDataContent.Add(new ByteArrayContent(fileBytes)); 

        const string requestUri = "http://do.convertapi.com/word2pdf"; 

        var response = await client.PostAsync(requestUri, multipartFormDataContent); 
        if (response.IsSuccessStatusCode) 
        { 
         var responseHeaders = response.Headers; 
         var paths = responseHeaders.GetValues("OutputFileName").First(); 
         var path2 = Path.Combine(@"C:\", paths); 



         StorageFile sampleFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(@"C:\Users\Thought\AppData\Local\Packages\xxxxx_apk0zz032bzya\LocalState\Data\"); 
         await FileIO.WriteBytesAsync(sampleFile, await response.Content.ReadAsByteArrayAsync()); 


        } 
        else 
        { 
         Debug.WriteLine("Status Code : {0}", response.StatusCode); 
         Debug.WriteLine("Status Description : {0}", response.ReasonPhrase); 
        } 

       } 
      } 
     } 
     catch (Exception e) 
     { 
      Debug.WriteLine(e.Message); 
     } 

    } 

@Tomas пытались приспособить ваш ответ немного, так как там, кажется, не быть «File.ReadAllBytes» на окна магазина приложений, им получить этот ответ Тхо: \ enter image description here

+0

Я думаю, вам нужно использовать 'MultipartFormDataContent' и не' FormUrlEncodedContent'. Проверьте [здесь] (http://stackoverflow.com/questions/16416601/c-sharp-httpclient-4-5-multipart-form-data-upload) и [здесь] (http://stackoverflow.com/questions/ 10339877/asp-net-webapi-how-to-perform-a-multipart-post-with-file-upload-use-webapi-ht) для примера. Для содержимого Файла (на основе моего Fiddling запроса этой страницы) 'Content-Disposition' должен быть' form-data; name- "Файл"; filename = "" (заменить ). 'Content-Type может' быть 'application/msword', не уверен. –

ответ

2

Вы не можете передавать поток файлов как строку в HttpClient. Просто используйте метод WebClient.UploadFile, который также поддерживает асинхронные загрузки.

using (var client = new WebClient()) 
      {     

       var fileToConvert = "c:\file-to-convert.docx"; 


       var data = new NameValueCollection();     

       data.Add("ApiKey", "413595149"); 

       try 
       {      
        client.QueryString.Add(data); 
        var response = client.UploadFile("http://do.convertapi.com/word2pdf", fileToConvert);      
        var responseHeaders = client.ResponseHeaders;      
        var path = Path.Combine(@"C:\", responseHeaders["OutputFileName"]); 
        File.WriteAllBytes(path, response); 
        Console.WriteLine("The conversion was successful! The word file {0} converted to PDF and saved at {1}", fileToConvert, path); 
       } 
       catch (WebException e) 
       { 
        Console.WriteLine("Exception Message :" + e.Message); 
        if (e.Status == WebExceptionStatus.ProtocolError) 
        { 
         Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode); 
         Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription); 
        } 

       } 


      } 

Пример использования HttpClient()

using (var client = new System.Net.Http.HttpClient()) 
    { 
     using (var multipartFormDataContent = new MultipartFormDataContent()) 
     { 
      var values = new[] 
      { 
       new KeyValuePair<string, string>("ApiKey", "YourApiKey") 
      }; 

      foreach (var keyValuePair in values) 
      { 
       multipartFormDataContent.Add(new StringContent(keyValuePair.Value), String.Format("\"{0}\"", keyValuePair.Key)); 
      } 

      multipartFormDataContent.Add(new ByteArrayContent(File.ReadAllBytes(@"C:\test.docx")), '"' + "File" + '"', '"' + "test.docx" + '"'); 

      const string requestUri = "http://do.convertapi.com/word2pdf"; 

      var response = await client.PostAsync(requestUri, multipartFormDataContent); 
      if (response.IsSuccessStatusCode) 
      { 
       var responseHeaders = response.Headers; 
       var paths = responseHeaders.GetValues("OutputFileName").First(); 
       var path = Path.Combine(@"C:\", paths); 
       File.WriteAllBytes(path, await response.Content.ReadAsByteArrayAsync()); 
      } 
      else 
      { 
       Console.WriteLine("Status Code : {0}", response.StatusCode); 
       Console.WriteLine("Status Description : {0}", response.ReasonPhrase); 
      } 

     } 
    } 
+0

im работает в приложении Windows Store, у которого, похоже, нет WebClient, нет шансов для пользователя с httpclient или какой-либо другой альтернативой? – Ric

+0

Ответ обновлен с примером HttpClient.PostAsync. – Tomas

+0

я отредактировал мое сообщение, все еще получаю некоторые проблемы: \ – Ric

Смежные вопросы