Почему этот код отправляет файлы 0kb в браузер? - PullRequest
0 голосов
/ 13 сентября 2010

вот звонок ...

return new FileUriResult("application/octet-stream", a.AssetPath, null);

[обратите внимание, что я установил длину содержимого на ноль, потому что я ее не знаю (файл находится на другом сервере)]

a.AssetPath: «http://http.cdnlayer.com/account имя / папка / папка / папка / asset.mp3»

(поддельный URL для этого примера, но в моей реализации я могу просматривать файл напрямую, однако этот метод вложения не работает)

вот реализация ...

public class FileUriResult : ActionResult
    {
        private string _contentType;
        private string _fileUri;
        private long? _fileLength;

        public FileUriResult(string contentType, string fileUri, long? fileLength)
        {
            _contentType = contentType;
            _fileUri = fileUri;
            _fileLength = fileLength;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            HttpResponseBase response = context.HttpContext.Response;

            response.ContentType = _contentType;
            response.AddHeader("Content-Disposition", "attachment; filename=" + _fileUri);
            if(_fileLength != null)
                response.AddHeader("Content-Length", _fileLength.ToString());
        }
    }

Файл загружается напрямую, как я хочу (не открывается браузером), однако это НЕ файл, это просто файл размером 0 КБ с тем же именем.

1 Ответ

1 голос
/ 13 сентября 2010

Вы можете принудительно загрузить загрузку как вложение, отправив двоичные данные, используя, например, FileResult. Таким способом нельзя принудительно загрузить файл в виде вложения из URL. Все, что вы говорите браузеру, это то, что ниже следует вложение, и вы даете ему URL-адрес в качестве имени для сохранения.

Вам нужно прочитать файл самостоятельно и записать его в ответ в виде последовательности байтов.

...