C# 将pdf从url转换为流

C# 将pdf从url转换为流,c#,asp.net,pdf,stream,uri,C#,Asp.net,Pdf,Stream,Uri,我有一个PDF是在说托管 如何将PDF转换为流,然后使用此流将其转换回PDF 我尝试了以下操作,但出现了一个异常(见图): 这将起作用: private static Stream ConvertToStream(string fileUrl) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(fileUrl); HttpWebResponse response = (HttpWebResponse)requ

我有一个PDF是在说托管

如何将PDF转换为
,然后使用此
将其转换回PDF

我尝试了以下操作,但出现了一个异常(见图):

这将起作用:

private static Stream ConvertToStream(string fileUrl)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(fileUrl);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    try {
        MemoryStream mem = new MemoryStream();
        Stream stream = response.GetResponseStream();

        stream.CopyTo(mem,4096);

        return mem;
    } finally {
        response.Close();
    }
}
但是,您完全负责返回内存流的生存期

更好的方法是:

private static void ConvertToStream(string fileUrl, Stream stream)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(fileUrl);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    try {
        Stream response_stream = response.GetResponseStream();

        response_stream.CopyTo(stream,4096);
    } finally {
        response.Close();
    }
}
然后,您可以执行以下操作:

using (MemoryStream mem = new MemoryStream()) {
    ConvertToStream('http://www.example.com/',mem);
    mem.Seek(0,SeekOrigin.Begin);

    ... Do something else ...
}

您也可以直接返回响应流,但必须检查响应流的生存期,释放响应可能会释放流,因此会释放mem副本。

您可能需要查看一下

您给它一个URL和本地文件名,它会将文件直接保存到磁盘。也许可以帮你省下一两步

您还可以尝试将文件保存到内存中的
字节[]

编辑

您没有指定要将文件发布到的web服务的协议。最简单的形式(RESTful)就是将文件发送到另一个URL。下面是你将如何做到这一点

using (WebClient wc = new WebClient())
{
    // copy data to byte[]
    byte[] data = wc.DownloadData("http://somesite.com/your.pdf");

    // POST data to another URL
    wc.Headers.Add("Content-Type","application/pdf");
    wc.UploadData("http://anothersite.com/your.pdf", data);
}

如果您使用的是SOAP,则必须将文件转换为Base64字符串,但希望您使用的是一个生成的客户机,它将为您处理该问题。如果您能详细说明将文件发送到的web服务类型,我可能会提供更多信息。

您到底想做什么?向用户发送本地pdf以便用户可以保存?从用户处接收pdf(上传)并保存到本地磁盘?具体是什么?基本上我从webservice获取pdf的url,将其发送到我的应用程序,在我的应用程序中将其转换为流并发送到另一个webservice,然后在那里我将阅读流转换回pdf并保存…希望不会混淆我知道我可以这样做,但我的要求是不要直接保存它,因为我要将它发送到另一台服务器。是否有任何东西阻止您使用
字节[]
?我想如果你不把任何东西保存到磁盘上,你无论如何都会想要一个内存缓冲区。请查看我的更新答案。请使用byte[]发送一个示例。我添加了一些示例代码,但不确定要将文件发送到的web服务的类型。让我知道这是否有帮助。这是一个wcf服务,当使用您提供的代码示例时,我可以看到数据有字节,但在传输到wcf时,我收到此错误,请您提供帮助:格式化程序在尝试反序列化消息时引发异常:尝试反序列化参数时出错。InnerException消息是“反序列化System.Collections.Generic.List类型的对象时出错”`1A流上的实用方法,允许您从一个流复制到另一个流。基本上,我的要求是从webservice获取pdf的url,并将其发送到我的应用程序,在我的应用程序中,我会将其转换为流并发送到另一个Web服务,然后在那里,我将阅读流转换回pdf并保存…希望不会混淆它可能依赖于框架。但是,您可以自己轻松编写复制代码/扩展方法。它只是从一个流读取数据,然后写入另一个流。您的问题是直截了当的,您可以使用我的代码(有或没有CopyFrom),在…中执行其他操作。。。您可以根据需要获取mem并将其传递给web服务。您已经尝试了您的方法,但仍然在上面遇到异常screenshot@MaxHodges你说得对,过去和现在都很尴尬!现在决定了,谢谢。
using (WebClient wc = new WebClient())
{
    // copy data to byte[]
    byte[] data = wc.DownloadData("http://somesite.com/your.pdf");

    // POST data to another URL
    wc.Headers.Add("Content-Type","application/pdf");
    wc.UploadData("http://anothersite.com/your.pdf", data);
}