web-dev-qa-db-ja.com

ウェブページ内のリンクからファイルをダウンロード

オブジェクトのテーブルを含むWebページがあります。

私のオブジェクトプロパティの1つはファイルパスです。このファイルは同じネットワーク内にあります。私がしたいことは、リンクの下にこのファイルパスをラップし(たとえば、ダウンロード)、ユーザーがこのリンクをクリックした後、ファイルがユーザーのマシンにダウンロードされます。

だから私のテーブルの中:

@foreach (var item in Model)
        {    
        <tr>
            <th width ="150"><p><b><a href="default.asp" target="_blank">Download</a></b></p></th>
            <td width="1000">@item.fileName</td>
            <td width="50">@item.fileSize</td>
            <td bgcolor="#cccccc">@item.date<td>
        </tr>
    }
    </table>

私はこのダウンロードリンクを作成しました:

<th width ="150"><p><b><a href="default.asp" target="_blank">Download</a></b></p></th>

このダウンロードリンクでfile pathをラップし、リンクをクリックするとコントローラーに寄りかかります。

public FileResult Download(string file)
{
    byte[] fileBytes = System.IO.File.ReadAllBytes(file);
}

それを達成するためにコードに何を追加する必要がありますか?

18
user2978444

アクションからFileContentResultを返します。

public FileResult Download(string file)
{
    byte[] fileBytes = System.IO.File.ReadAllBytes(file);
    var response = new FileContentResult(fileBytes, "application/octet-stream");
    response.FileDownloadName = "loremIpsum.pdf";
    return response;
}

そしてダウンロードリンク、

<a href="controllerName/[email protected]" target="_blank">Download</a>

このリンクは、パラメーターfileNameを使用して、ダウンロードアクションへのgetリクエストを作成します。

編集:見つからないファイルについては、

public ActionResult Download(string file)
{
    if (!System.IO.File.Exists(file))
    {
        return HttpNotFound();
    }

    var fileBytes = System.IO.File.ReadAllBytes(file);
    var response = new FileContentResult(fileBytes, "application/octet-stream")
    {
        FileDownloadName = "loremIpsum.pdf"
    };
    return response;
}
30
mecek

ビューで、次のように記述します。

<a href="/ControllerClassName/DownloadFile?file=default.asp" target="_blank">Download</a>

コントローラで、次のように記述します。

public FileResult DownloadFile(string file)
    {
        string filename = string.Empty;
        Stream stream = ReturnFileStream(file, out filename); //here a backend method returns Stream
        return File(stream, "application/force-download", filename);
    }
0
Rizvi Sarwar

それぞれのコントローラファイルでこのコードを使用します。

public ActionResult Index()
       {
           foreach (string upload in Request.Files)
           {
               if (Request.Files[upload].FileName != “”)
               {
                   string path = AppDomain.CurrentDomain.BaseDirectory + “/App_Data/uploads/”;
                   string filename = Path.GetFileName(Request.Files[upload].FileName);
                   Request.Files[upload].SaveAs(Path.Combine(path, filename));
               }
           }
           return View(“Upload”);
       }
0
Chandan Kumar

この例は私にとってはうまくいきます:

public ActionResult DownloadFile(string file="")
        {

            file = HostingEnvironment.MapPath("~"+file);

            string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            var fileName = Path.GetFileName(file);
            return File(file, contentType,fileName);    

        }

表示:

< script >
function SaveImg()
{
    var fileName = "/upload/orders/19_1_0.png";
    window.location = "/basket/DownloadFile/?file=" + fileName;
}
< /script >
<img class="modal-content" id="modalImage" src="/upload/orders/19_1_0.png" onClick="SaveImg()">
0
Hamid