неверный виртуальный путь - при попытке вернуть файл из URL - PullRequest
2 голосов
/ 02 апреля 2012

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

Так, например, если на странице есть кнопка с названием download для определенного файла .pdf, в конечном итоге у нас в контроллере есть код, идущий к cdn и загружающий файл, архивирующий его и возвращающий URL, такой как: http://www.ourLocalAssetServer.com/assets/20120331002728.zip

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

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

Вот мой код:

@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>
    }
}

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

        // take the passed Cdn Url and go and download that file to one of our other servers so the user can download that .zip file
        downloadUrl = GetFileZipDownloadUrl(carId, userId, fileCdnUrl;

        // now we have that url to the downloaded zip file e.g. http://www.ourLocalAssetServer.com/assets/20120331002728.zip
        int i = downloadUrl.LastIndexOf("/");

        string fileName = downloadUrl.Substring(i);

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

ошибка: недопустимый виртуальный путь

1 Ответ

0 голосов
/ 02 апреля 2012

Это не будет работать, если zip-файл находится в вашем виртуальном пути.

Метод File, который вы использовали здесь File (строка, строка, строка), ожидает fileName, который будет использоваться для создания FilePathResult.

Другой вариант - загрузить его (используя методы WebClient.DownloadData или DownloadFile) и передать либо байтовый массив, либо путь к файлу (в зависимости от того, что вы выберете).

var webClient = new Webclient();
byte[] fileData = webClient.DownloadData(downloadUrl);

return File(fileData, "application/zip", fileName);

И строки, где вы получаете индекс "/" просто для того, чтобы получить имя файла, не нужны, как вы могли бы использовать:

string fileName = System.IO.Path.GetFileName(downloadUrl);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...