2012-05-25 3 views
1

Я пытаюсь создать функцию загрузки в действии MVC, а фактическая загрузка работает, но файл сохраняется с именем action в качестве имени файла, например. из приведенного ниже кода я получаю имя файла «DownloadMP3». Кто-нибудь знает, как сохранить исходное имя файла при загрузке?Создание функции загрузки файлов

[Authorize] 
    public virtual FileResult DownloadMP3(string fileName) 
    { 
     //Actions/Download?filename=test 

     //test 
     string filePath = @"~/Content/xxxxx/" + fileName + ".mp3"; 

     Response.AddHeader("content-disposition", "attachment;" + filePath + ";"); 

     return File(filePath, "audio/mpeg3"); 

     //for wav use audio/wav 

    } 

ответ

1

Правильный синтаксис заголовка Content-Disposition, как это:

Content-Disposition: attachment; filename=foo.mp3 

Но в этом случае вы могли бы просто использовать перегрузку метода File, который принимает 3 аргумента, третий является имя файла. Он автоматически выдает заголовок Content-Disposition с вложением, поэтому вам не нужно вручную добавлять его (и делать ошибки в своем синтаксисе, как вы это делали).

Также ваша переменная filePath должна указывать на физический файл на сервере, а не на относительный URL-адрес. Используйте Server.MapPath для этого:

public virtual ActionResult DownloadMP3(string fileName) 
{ 
    var downloadPath = Server.MapPath("~/Content/xxxxx/"); 
    fileName = Path.ChangeExtension(Path.GetFileName(fileName), "mp3"); 
    var file = Path.Combine(downloadPath, fileName); 
    return File(file, "audio/mpeg3", fileName); 
} 
0

Просто поместите имя файла в расположении контента, а не виртуальный путь:

string fileOnly = fileName + ".mp3"; 
    string filePath = @"~/Content/xxxxx/" + fileOnly; 

    Response.AddHeader("content-disposition", "attachment;" + fileOnly + ";"); 
0

Попробуйте добавить третий параметр

return File(file.FullPath, file.MimeType, file.FullName); 
Смежные вопросы