2013-04-18 2 views
0

Я вызываю подпрограмму в PHP (TCPDF) из C# через WebRequest с помощью StreamReader. PDF-файл возвращается как поток и сохраняется в строке (obv). Я знаю, что данные, возвращаемые в строку, фактически являются файлами PDF, так как я тестировал их на PHP. Мне сложно записывать строку в файл и фактически получать действительный PDF-код на C#. Я знаю, что это связано с тем, как я пытаюсь закодировать файл, но несколько вещей, которые я пробовал, привели к «Не сегодня, Падре» (т.е. они не работали)Скопировать поток PDF в файл

Вот класс я использую для выполнения запроса (спасибо пользователю «Paramiliar» для примера я использую/заимствованные/украла):

public class httpPostData 
    { 
     WebRequest request; 
     WebResponse response; 

     public string senddata(string url, string postdata) 
     { 

      // create the request to the url passed in the paramaters 
      request = (WebRequest)WebRequest.Create(url); 


      // set the method to POST 
      request.Method = "POST"; 

      // set the content type and the content length 
      request.ContentType = "application/x-www-form-urlencoded"; 
      request.ContentLength = postdata.Length; 

      // convert the post data into a byte array 
      byte[] byteData = Encoding.UTF8.GetBytes(postdata); 

      // get the request stream and write the data to it 
      Stream dataStream = request.GetRequestStream(); 
      dataStream.Write(byteData, 0, byteData.Length); 
      dataStream.Close(); 

      // get the response 
      response = request.GetResponse(); 
      dataStream = response.GetResponseStream(); 
      StreamReader reader = new StreamReader(dataStream); 

      // read the response 
      string serverresponse = reader.ReadToEnd(); 

      //Console.WriteLine(serverresponse); 
      reader.Close(); 
      dataStream.Close(); 
      response.Close(); 

      return serverresponse; 
     } 
    } // end class httpPostData 

... и мой призыв к нему

httpPostData myPost = new httpPostData();  
// postData defined (not shown) 
string response = myPost.senddata("http://www.example.com/pdf.php", postData); 

Если это не ясно, я застрял писать string response в действительный файл .pdf. Я пробовал это (спасибо пользователя Adrian):

static public void SaveStreamToFile(string fileFullPath, Stream stream) 
    { 
     if (stream.Length == 0) return; 

     // Create a FileStream object to write a stream to a file 
     using (FileStream fileStream = System.IO.File.Create(fileFullPath, (int)stream.Length)) 
     { 
      // Fill the bytes[] array with the stream data 
      byte[] bytesInStream = new byte[stream.Length]; 
      stream.Read(bytesInStream, 0, (int)bytesInStream.Length); 

      // Use FileStream object to write to the specified file 
      fileStream.Write(bytesInStream, 0, bytesInStream.Length); 
     } 
    } 

..and the call to it: 

    string location = "C:\\myLocation\\"; 

    SaveStreamToFile(location, response); // <<-- this throws an error b/c 'response' is a string, not a stream. New to C# and having some basic issues with things like this 

Я думаю, что я близко ... толчок в правильном направлении было бы весьма признателен.

+0

@Fernando: В то время как я ценю предложение (и я Посмотрите на WebClient), вы действительно не отвечаете на вопрос. Кроме того, как вы можете видеть из приведенного выше примера, нет загружаемого файла, а только поток, который будет захвачен (не будет обсуждать семантику, почему в техническом смысле это может быть одно и то же). Я не хочу создавать файл на стороне сервера - я хочу загрузить поток, созданный POST-запросом, в PHP-скрипт. –

+0

Я не собираюсь отмечать этот вопрос «Ответ», так как я никогда не мог понять, как захватить поток .pdf как строку, а затем записать эту строку в действительный файл .pdf. Я пытался устранить это: –

+0

(oops) устранить несколько этапов (т. Е. Создать файл на сервере, загрузить файл с сервера, а затем удалить файл на сервере). Казалось, что три лишних шага. В конце концов, так я справлялся с этим, так как тратил слишком много времени на решение. Я был удивлен, как быстро эти три шага были обработаны (<1 секунда, включая d/l файла 50 КБ). Тем не менее, ответ был бы приятным;) –

ответ

0

Вы можете использовать WebClient. Используйте метод DownloadFile или асинхронные.

Удачи! Fernando.-


К сожалению, я не читаю ваши комментарии до сих пор. Я думаю, вы уже сделали это ...

Но это может помочь (просто заменить адреса и пути) (от: http://msdn.microsoft.com/en-us/library/ez801hhe.aspx)

string remoteUri = "http://www.contoso.com/library/homepage/images/"; 
string fileName = "ms-banner.gif", myStringWebResource = null; 

// Create a new WebClient instance. 
WebClient myWebClient = new WebClient(); 

// Concatenate the domain with the Web resource filename. 
myStringWebResource = remoteUri + fileName; 

Console.WriteLine("Downloading File \"{0}\" from \"{1}\" .......\n\n", fileName, myStringWebResource); 

// Download the Web resource and save it into the current filesystem folder. 
myWebClient.DownloadFile(myStringWebResource,fileName);  

Console.WriteLine("Successfully Downloaded File \"{0}\" from \"{1}\"", fileName, myStringWebResource); 

Console.WriteLine("\nDownloaded file saved in the following file system folder:\n\t" + Application.StartupPath);