如何在mquery中显示存储在mvc4中的Server.mappath外部的文件?

时间:2016-09-29 05:18:27

标签: jquery asp.net-mvc asp.net-mvc-4

我正在开发mvc4中的网页,我想使用jquery显示pdf文件。我将文件存储在server.mappath之外。下面是我的控制器代码。

  public ActionResult Download(int? ClientId)
        {
            service.Service objService = new service.Service();
            DashboardBAL objdb = new DashboardBAL();
            string filepath = objdb.GetFilepath(ClientId.GetValueOrDefault(0));
            string folderName = @"F:\UploadedFile";
            //string serverMappath = ("~/UploadedFile");
            string serverMappath = (folderName);
            // byte[] result = objService.DownloadFileFromDMS(filepath);
            byte[] result = objService.DownloadFileFromDMS(folderName);
            string contentType = MimeMapping.GetMimeMapping(filepath);
            string FileName = Path.GetFileName(filepath);
            var cd = new System.Net.Mime.ContentDisposition
            {
                FileName = Path.GetFileName(filepath),
                Inline = true,
            };
            if (!System.IO.Directory.Exists(serverMappath))
            {
                System.IO.Directory.CreateDirectory(serverMappath);
            }
            string strdocPath = serverMappath + @"\" + FileName;
            if (result != null)
            {
                FileStream objfilestream = new FileStream(strdocPath, FileMode.Create, FileAccess.Write);
                objfilestream.Write(result, 0, result.Length);
                objfilestream.Close();
            }
            return Json(FileName, JsonRequestBehavior.AllowGet);
        }

我正在使用@“F:\ UploadedFile”中的文件,这是在我的根目录之外。所以它无法直接访问。在上面的代码我也检索文件名和相应的文件字节。 下面是我的jquery代码来显示文件。

  function ShowFiepopup(FileName) {

    $("#dialog").dialog({
        modal: true,
        title: "Preview of " + FileName,
        width: 850,
        height: 600,
        buttons: {
            Close: function () {
                $(this).dialog('close');
            }
        },

        open: function () {
            var object = "<object data=\"{FileName}\" type=\"application/pdf\" Zoom=\"100%\" width=\"800px\" height=\"600px\">";
            object += "If you are unable to view file, you can download from <a href=\"{FileName}\">here</a>";
            object += " or download <a target = \"_blank\" href = \"http://get.adobe.com/reader/\">Adobe PDF Reader</a> to view the file.";
            object += "</object>";
            object = object.replace(/{FileName}/g, "../UploadedFile/" + FileName);
            $("#dialog").html(object);

        }
    });
};


function Download(pClientid) {

       $.ajax(
        {
            type: "GET",
            cache: false,
            data: { ClientId: pClientid },
            dataType: "json",
            cache: false,
            url: '/TestRendering/Download',
            headers: {
                'VerificationToken': forgeryId
            },
            success: function (data) {
                ShowFiepopup(data);
            }
        });
    }

在jquery中我只收到文件名,下面的代码行只有在我的root文件中的uploadfile文件夹才有效。

    object = object.replace(/{FileName}/g, "../UploadedFile/" + FileName);

但是如果我将文件存储在root之外,例如,如果我将其保存在@“F:\ UploadedFile”路径中,则jquery代码将无法直接访问文件。那么我可以使用上面的代码访问文件和显示的方式是什么?我不确定我只想返回文件名或完整路径?如果它是完整路径那么我如何在jquery中呈现它?请给我一些宝贵的意见。感谢

1 个答案:

答案 0 :(得分:2)

你需要在控制器中有一个返回FileResult的Action,在这个操作中你将从F:\ Drive中读取文件并将其作为StreamResult或FileResult返回,然后在你的JQuery中,而不是写入文件名,您将使用@ Url.Actiont输出检索文件的Action的URL,这样它总是看起来像存储在您的wwwroot中

 function Download(pClientid) {

   $.ajax(
    {
        type: "GET",
        cache: false,
        data: { ClientId: pClientid },
        dataType: "json",
        cache: false,
        url: '@Url.Action("actionName","ControllerName")',
        headers: {
            'VerificationToken': forgeryId
        },
        success: function (data) {
            ShowFiepopup(data);
        }
    });
}