2012-04-02 16 views
2

私たちはCdNからファイルをダウンロードし、そのダウンロードしたファイルのURLをユーザーに返します。私はこれを実装しようとしているので、ユーザーがダウンロードボタンをクリックすると、ダウンロードされたファイルにそのURLがテストされ、そのローカルURLに基​​づいて保存プロンプトが強制的に実行されます。は有効な仮想パスではありません - URLからファイルを返そうとしているとき

だから、特定のPDFファイルのためのページからダウンロードというボタンがある場合、たとえば、我々は最終的に私たちのコントローラは、それが、その後のようなURLを返すビュン、CDNに行くと、ファイルをダウンロードするには、コードを持っている:http://www.ourLocalAssetServer.com/assets/20120331002728.zip

File()メソッドを使用して、システムディレクトリの仮想パスではなく、ファイルへのURLがあるときに保存プロンプトを表示するようにリソースをユーザーに返すことができるかどうかはわかりません。

どうすればこのURLで作業できますか?上記の例で生成されたものなど、URLを指定すると、最後に保存プロンプトを強制的に実行するには、ダウンロードボタンが必要ですか?私はGETではなくPOSTを使用しているわけではないので、この場合にはどちらを使うべきかはわかりません。それは私の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); 
    } 

エラー:

答えて

0

これは、zipファイル以外は動作しませんが、あなたの仮想パスではありません有効な仮想パス

は、ここに私のコードです。

ここで使用したFileメソッドFile(string、string、string)には、FilePathResultの作成に使用されるfileNameが必要です。

もう1つの方法は、(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); 
関連する問題