Как вызвать сохранить как приглашение для возвращенного пути к файлу - PullRequest
0 голосов
/ 31 марта 2012

Я действительно не кодировал это раньше, но у меня есть список имен файлов на мой взгляд.Рядом с ними есть кнопка загрузки.Так, например:

enter image description here

вот разметка представления для этого:

@foreach (CarFileContent fileContent in ModelCarFiles)
{
    using (Html.BeginForm("GetFileDownloadUrl", "Car", FormMethod.Get, new { carId = Model.CarId, userId = Model.UserId, @fileCdnUrl = fileContent.CdnUrl }))
    {
        @Html.Hidden("userId", Model.UserId);
        @Html.Hidden("carId", Model.CarId);
        @Html.Hidden("fileCdnUrl", fileContent.CdnUrl);        
        <p><input type="submit" name="SubmitCommand" value="download" /> @fileContent.Name</p>
    }
}

При щелчке я отправляю URL CdN в мой метод действия, который вКапот загружает этот файл из Rackspace, а затем копирует его на наш сервер для загрузки пользователем.Таким образом, мой метод действия возвращает URL в файл .zip, к которому у пользователя теперь есть доступ для скачивания.Но когда я проверяю это, он отправляет обратно и перенаправляет меня на пустую страницу, на которой отображается URL, отображаемый в тексте на странице, и все!

"http://www.ourAssetServer.com/assets/20120331002728.zip"

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

Я хочу, чтобы это произошло так:

  1. Пользователь нажимает кнопку загрузки
  2. Метод действия делает свое дело, загружает файл в серверную часть
  3. Пользователь, кажется, получает всплывающее окно с сохранением сразу после нажатия кнопки загрузки.

это, наверное, рутина, но я никогда не делал этого раньше.Мне нужна помощь, чтобы выяснить, как отобразить приглашение сохранения как, и как мне следует обработать возврат к моему представлению после того, как мой метод действия получит окончательный URL-адрес загрузки для ZIP-файла ... что мне делать с этим URL в моем действииметод ... вернуть его в вид?Не уверен здесь.

вот метод действия:

[HttpGet]
public string GetFileDownloadUrl(string fileCdnUrl int carId, int userId)
{
    string downloadUrl = string.Empty;
    downloadUrl = GetFileZipDownloadUrl(carId, userId, fileCdnUrl);

    return downloadUrl;
}

downloadUrl , возвращенный в моем методе действия, это "http://www.ourAssetServer.com/assets/20120331002728.zip" строка дляпример отправлен обратно пользователю ... Мне просто нужно выяснить, как подключить этот провод к приглашению сохранить как, а также выяснить, как обрабатывать представление ... я перенаправляю обратно в то же представление или как? ОБНОВЛЕНИЕ:

После более подробного изучения я пришел к следующему:

    [HttpGet]
    public FilePathResult GetFileDownloadUrl(string fileCdnUrl, int carId, int userId)
    {
        string downloadUrl = string.Empty;
        downloadUrl = rackSpaceTask.GetFileZipDownloadUrl(carId, userId, fileCdnUrl);
        int i = downloadUrl.LastIndexOf("/");

        string fileName = downloadUrl.Substring(i);

        return File(downloadUrl, "application/zip", fileName);
    }

Я получаю ошибку 'http://ourAssetServer.com/assets/20120331002728.zip'; is not a valid virtual path

UPDATE # 2

Вот моя последняя попытка с использованием метода перенаправления, чтобы попытаться получить приглашение сохранения, чтобы показать. Что происходит, так это то, что он нажимает на мой GetFileDownloadUrl, но, кажется, никогда не попадает в мой метод действия Redirectи я в конечном итоге перенаправлен на полностью пустую страницу (полностью белую) с URL-адресом http://localhost/Car/GetFileDownloadUrl и просто останавливается там

    @foreach (CarContent fileContent in Model.CarFiles)
    {
        using (Html.BeginForm("GetFileDownloadUrl", "Car", FormMethod.Post, new { carId = Model.CarId, userId = Model.UserId, @fileCdnUrl = fileContent.FileCdnUrl }))
        {
            @Html.Hidden("userId", Model.UserId);
            @Html.Hidden("carId", Model.CarId);
            @Html.Hidden("fileCdnUrl", fileContent.FileCdnUrl);        
            <p><input type="submit" name="SubmitCommand" value="download" /> @fileContent.Name</p>
        }
    }


public void GetFileDownloadUrl(string fileCdnUrl, int carId, int userId)
{
    string cownloadUrl = string.Empty;
    cownloadUrl = GetFileDownloadUrl(carId, userId, fileCdnUrl);

    RedirectToAction("RedirectToUrl", downloadUrl);
}


public ActionResult RedirectToUrl(string fileUrl)
{
    Response.Redirect(fileUrl);
    return null;
}

Я не уверен, как следует кодировать RedirectToUrl.... тип возврата и что вы возвращаете, если что-нибудь?держать меня на странице, на которой я был?Я не «думаю», что это даже удар, только мой первый метод.Я поставил точку отладки в Response.Redirect, и она никогда не срабатывает ... только точка отладки в RedirectToAction ("RedirectToUrl", downloadUrl);

Ответы [ 2 ]

1 голос
/ 31 марта 2012

Вам нужно вернуть FileResult вместо string.

return File(path + fileName, "application/zip", "20120331002728.zip");
0 голосов
/ 31 марта 2012

Рассмотрите возможность определения нового действия «RedirectToUrl», которое принимает в качестве параметра url, а затем используйте RedirectToAction в вашем коде:

public ActionResult GetFileDownloadUrl(string fileCdnPath int carId, int userId)
{
    string downloadUrl = string.Empty;
    downloadUrl = GetFileZipDownloadUrl(carId, userId, fileCdnPath);

    return RedirectToAction("RedirectToUrl",
        new { url = downloadUrl });
}

Обновление: использование FilePathResult с Server.MapPath - это еще один вариант (при условии, что сервервы загружаете файл на тот же сервер, на котором выполняется код ASP.NET MVC).Добавьте следующее в конец функции в вашем последнем редактировании:

 var assetsPath = Server.MapPath("~/assets");
 var localPath = Path.Combine(assetsPath, zipFileName );

 return this.File(localPath, "application/zip");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...