Probleme mit dem herunterladen von pdf-Datei aus dem web-api-service
Ich versuche zum einrichten einer web-api-service, der sucht ein .pdf-Datei in einem Verzeichnis und gibt die Datei, wenn es gefunden wird.
Den controller
public class ProductsController : ApiController
{
[HttpPost]
public HttpResponseMessage Post([FromBody]string certificateId)
{
string fileName = certificateId + ".pdf";
var path = @"C:\Certificates\20487A" + fileName;
//check the directory for pdf matching the certid
if (File.Exists(path))
{
//if there is a match then return the file
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
var stream = new FileStream(path, FileMode.Open);
stream.Position = 0;
result.Content = new StreamContent(stream);
result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") { FileName = fileName };
result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");
result.Content.Headers.ContentDisposition.FileName = fileName;
return result;
}
else
{
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.Gone);
return result;
}
}
}
Rufe ich den service mit dem folgenden code
private void GetCertQueryResponse(string url, string serial)
{
string encodedParameters = "certificateId=" + serial.Replace(" ", "");
HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(url);
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded";
httpRequest.AllowAutoRedirect = false;
byte[] bytedata = Encoding.UTF8.GetBytes(encodedParameters);
httpRequest.ContentLength = bytedata.Length;
Stream requestStream = httpRequest.GetRequestStream();
requestStream.Write(bytedata, 0, bytedata.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)httpRequest.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
byte[] bytes = null;
using (Stream stream = response.GetResponseStream())
using (MemoryStream ms = new MemoryStream())
{
int count = 0;
do
{
byte[] buf = new byte[1024];
count = stream.Read(buf, 0, 1024);
ms.Write(buf, 0, count);
} while (stream.CanRead && count > 0);
ms.Position = 0;
bytes = ms.ToArray();
}
var filename = serial + ".pdf";
Response.ContentType = "application/pdf";
Response.Headers.Add("Content-Disposition", "attachment; filename=\"" + filename + "\"");
Response.BinaryWrite(bytes);
}
}
Diese scheint zu funktionieren in dem Sinne, dass die download-Datei ist der Dialog gezeigt, mit den richtigen Dateinamen und-Größe etc, aber der download dauert nur ein paar Sekunden (wenn die Datei-Größen sind >30mb) und die Dateien sind beschädigt, wenn ich versuche, Sie zu öffnen.
Irgendwelche Ideen was ich falsch mache?
versuchen Sie Antwort.Flush(); nach der Antwort.BinaryWrite(bytes);
gerade probiert, machte keinen Unterschied.
Nicht, dass das geht...aber Sie können ersetzen diese 2 Zeilen
gerade probiert, machte keinen Unterschied.
Nicht, dass das geht...aber Sie können ersetzen diese 2 Zeilen
var stream = new FileStream(path, FileMode.Open); stream.Position = 0;
mit var stream = new FileStream(path, FileMode.OpenRead);
InformationsquelleAutor user2987564 | 2014-05-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein code sieht ähnlich aus wie das, was Ive in der Vergangenheit verwendet, aber unten ist das, was ich normalerweise verwenden:
Poste ich dies aus 2 Gründen. Hinzufügen der content-length-header, die Sie haben können, um anzugeben, wie groß die Datei ist ja so das die Anwendung wartet, bis die gesamte Antwort.
Wenn das nicht zu beheben. Legen Sie einen Haltepunkt, nicht die byte-array-Inhalt der entsprechenden Länge (alias, 30 Millionen bytes für eine 30 MB Datei)? Haben Sie fiddler, um zu sehen, wie viel Inhalt kommt wieder über den HTTP-Aufruf?
Froh, dass es geholfen hat, herzlich willkommen!
InformationsquelleAutor ewitkows