W jednej z moich aplikacji internetowych asp.net muszę ukryć lokalizację pliku PDF dostarczanego użytkownikom.Próba przesłania pliku PDF za pomocą programu asp.net powoduje powstanie "uszkodzonego pliku".
Tak więc piszę metodę, która pobiera swoją zawartość binarną z jej lokalizacji w systemie CMS, a następnie opróżnia tablicę bajtów do użytkownika sieci.
Otrzymuję, niestety, błąd podczas pobierania strumienia: "Nie można otworzyć pliku, ponieważ jest uszkodzony" (lub coś podobnego do niego, podczas otwierania pliku w czytniku Adobe).
Pytanie 1: co robię źle? Pytanie 2: czy mogę pobierać duże pliki przy użyciu tego podejścia?
private void StreamFile(IItem documentItem)
{
//CMS vendor specific API
BinaryContent itemBinaryContent = documentItem.getBinaryContent();
//Plain old .NET
Stream fileStream = itemBinaryContent.getContentStream();
var len = itemBinaryContent.getContentLength();
SendStream(fileStream, len, itemBinaryContent.getContentType());
}
private void SendStream(Stream stream, int contentLen, string contentType)
{
Response.ClearContent();
Response.ContentType = contentType;
Response.AppendHeader("content-Disposition", string.Format("inline;filename=file.pdf"));
Response.AppendHeader("content-length", contentLen.ToString());
var bytes = new byte[contentLen];
stream.Read(bytes, 0, contentLen);
stream.Close();
Response.BinaryWrite(bytes);
Response.Flush();
}
Dlaczego nie użyć metody Response.WriteFile? –
Plik tak naprawdę nie istnieje w systemie plików. – Pablo
Aby było bardziej zrozumiałe: plik istnieje w bazie danych CMS. Adres URL jest adresowalny, ale nie mogę pobrać pliku z systemu plików. – Pablo