C # /. Net: возвращать файл в браузер? - PullRequest
3 голосов
/ 09 февраля 2010

После этого вопроса было рекомендовано создать файл на стороне сервера, который может вернуть файл из файловой системы. Как бы я пошел об этом в c # и .net. Я предполагаю, что я передаю имя файла в виде строки запроса, это читается страницей, и файл возвращается. Не совсем уверен, с чего начать с точки кодирования.

Ответы [ 4 ]

5 голосов
/ 09 февраля 2010

Вы можете использовать метод Response.WriteFile для отправки содержимого файла, хотя это может не работать с большими файлами.

Будьте осторожны, чтобы не указывать имя файла в строке запроса, поскольку пользователи могут использовать это для доступа к любому файлу на вашем сервере. Лучше иметь базу данных файлов, в которой разрешено имя для каждого из них, и искать имя, указанное в строке запроса, относительно этой базы данных, чтобы получить имя файла.

1 голос
/ 01 октября 2014

Вы можете использовать Response.TransmitFile, который полезен для передачи больших файлов. После этого вы должны использовать Response.Flush (). Тип содержимого здесь для zip-файла.

Response.ContentType = "application/zip";
Response.AppendHeader("Content-Disposition", "attachment; filename = D:\Splitted Parts.zip");
Response.TransmitFile(zipFileName);
Response.Flush();
1 голос
/ 09 февраля 2010

В этой теме есть мое предложение по обслуживанию файлов вне веб-корня. Он использует буфер для сокращения использования памяти.

1 голос
/ 09 февраля 2010

Я бы порекомендовал прочитать файл в виде байта [] и отправить его с установленным в ответе типом контента и расположением контента, а затем просто выполнить response.binarywrite и response.flush:

Byte[] bytes = null; 

try
{

    if(!FileExists(_filename)) return null;

    Byte[fs.Length] bytes 

    // get file contents
    using(System.IO.FileStream fs = System.IO.File.Open(_file, FileMode.Open, FileAccess.Read))
    {
        fs.Read(bytes, 0, fs.Length);
    }

}
catch(Exception ex)
{
            System.Text.ASCIIEncoding oEncoder = new System.Text.ASCIIEncoding();
            Byte[] bytes = oEncoder.GetBytes(ex.Message);

}

Context.Response.Buffer = false;
Context.ClearContent();
Context.ClearHeaders();
Context.ContentType = "application/octet-stream"; // Change this type as necessary
Context.AddHeader("Content-Length", bytes.Length.ToString());
Context.AddHeader("content-disposition", String.Format("inline; filename={0}", filename));
Context.Response.BinaryResult(bytes);
Context.Response.Flush();

Части ответа необходимо будет скорректировать в соответствии с вашей собственной платформой доставки (на отдельной странице, в iframe и т. Д.). Вы можете не хотеть ClearHeaders (), например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...