在Windows应用商店应用中使用convertapi

时间:2014-10-21 14:34:50

标签: c# post windows-runtime windows-store-apps convertapi

我在Windows商店App项目中尝试Convertapi,我想发送一个.docx文件并获得一个pdf文件作为回报,我试图做一个帖子,但我不知道它是如何完成的,这是我到目前为止所做的,但它不起作用。

    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文件?

修改

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尝试调整你的答案,因为在Windows应用商店中似乎没有“File.ReadAllBytes”,我得到了这样的回应: enter image description here

1 个答案:

答案 0 :(得分: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);
            }

        }
    }