Я вызываю подпрограмму в 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
Я думаю, что я близко ... толчок в правильном направлении было бы весьма признателен.
@Fernando: В то время как я ценю предложение (и я Посмотрите на WebClient), вы действительно не отвечаете на вопрос. Кроме того, как вы можете видеть из приведенного выше примера, нет загружаемого файла, а только поток, который будет захвачен (не будет обсуждать семантику, почему в техническом смысле это может быть одно и то же). Я не хочу создавать файл на стороне сервера - я хочу загрузить поток, созданный POST-запросом, в PHP-скрипт. –
Я не собираюсь отмечать этот вопрос «Ответ», так как я никогда не мог понять, как захватить поток .pdf как строку, а затем записать эту строку в действительный файл .pdf. Я пытался устранить это: –
(oops) устранить несколько этапов (т. Е. Создать файл на сервере, загрузить файл с сервера, а затем удалить файл на сервере). Казалось, что три лишних шага. В конце концов, так я справлялся с этим, так как тратил слишком много времени на решение. Я был удивлен, как быстро эти три шага были обработаны (<1 секунда, включая d/l файла 50 КБ). Тем не менее, ответ был бы приятным;) –