【问题标题】:Not allowed to load local resource Error不允许加载本地资源错误
【发布时间】:2015-10-06 11:24:00
【问题描述】:

我想在上传后显示上传的图片,但我不能。我从 JS 控制台收到错误消息:Not allowed to load local resource Error

这是我的代码:

控制器方法:

获取文件并保存到本地系统

[HttpPost]
// public static readonly string TEMPORARY_FILES_UPLOADS_PATH = "~/Uploads/Tmp";     
public ActionResult UploadFileToTemporaryFolder(HttpPostedFileBase file)
            {
                string fileName = String.Empty;
                string path = String.Empty;
                if (file != null)
                {
                    try
                    {
                       string timestamp = DateTime.UtcNow.ToString("yyyy_MM_dd_HH_mm_ss_fff",CultureInfo.InvariantCulture);
                       fileName = timestamp + "_" + Path.GetFileName(file.FileName);
                       path = string.Format("{0}/{1}", Server.MapPath(ApplicationConfig.TEMPORARY_FILES_UPLOADS_PATH), fileName);
                        System.IO.Directory.CreateDirectory(Server.MapPath(ApplicationConfig.TEMPORARY_FILES_UPLOADS_PATH));
                        file.SaveAs(path);
                    }
                    catch (Exception)
                    {}
                }
                return Json(new { FileName = fileName, FilePath=path }, JsonRequestBehavior.AllowGet);
            }

HTML:

<input id="HotelJustificatifFile" type="file" value="joindre pièce" name="upload"  >
<div id="JustificatifsHotelSection" style="display:block;"></div>

Js

上传文件并将结果附加到 div

 $('body').on('change', '#HotelJustificatifFile', function () {

               var file = document.getElementById('HotelJustificatifFile').files[0];
               if (file != null) {
                   var myData = new FormData();
                   myData.append("file", file);

                   // Uploading File via Ajax To Temporar Folder
                   $.ajax({
                       type: "POST",
                       url: "<%: Url.Action("UploadFileToTemporaryFolder","Enqueteur") %>",
                       processData: false,
                       contentType: false,
                       data: myData,
                       cache: false,
                       dataType: "json",
                       success: function (result) {
                           if (result.FileName != '') {

                               var fileName = result.FileName;
                               var filePath = result.FilePath;

                               //alert(filePath );
                               var imageDiv = "<div>";
                               imageDiv+='<div style="z-index: 10; position: absolute; top: 4px; left: 10px;">';
                               imageDiv += '<a onclick="afficherImage(' + fileName + ')" >Supprimer</a>';
                               imageDiv +='</div>';
                               imageDiv += '<img u=image src="' +filePath + '" />';
                               imageDiv += '</div>';
                               // Adding Image To the Div 
                               $('#JustificatifsHotelSection').append(imageDiv);

                           }
                           },
                       failure: function () {
                       }
                   });

                   // Else
                }
           });

【问题讨论】:

  • 看起来您正在返回服务器本地路径(例如 C:\uploads\blah.jpg 而不是 URL http://myserverrocks.com/images/blah.jpg
  • 没错,如何解决?

标签: javascript c# asp.net-mvc-4


【解决方案1】:

不能返回物理文件路径

尝试返回图片 url (http://...../imageName)

或者您可以使用 html5 API 在浏览器中显示图片,而无需将图片上传到服务器:

var file = document.getElementById(HotelJustificatifFile).files[0];
var reader = new FileReader();
var img = new Image();
img.src = reader.result;
youDivContainerForImage.appendChild(img);

【讨论】:

    【解决方案2】:

    您正在返回物理文件路径,请考虑:

    var virtualPath=Url.Content(string.Format("{0}/{1}",
        ApplicationConfig.TEMPORARY_FILES_UPLOADS_PATH, fileName));
    
    return Json(new { FileName = fileName, FilePath=virtualPath}, 
        JsonRequestBehavior.AllowGet);
    

    【讨论】:

      【解决方案3】:

      不允许加载本地资源错误,可能是这个链接解决了你的答案.. http://www.scriptscoop.net/t/17cccd1064d6/angularjs-1-2-not-allowed-to-load-local-resource.html

      【讨论】:

        【解决方案4】:

        我想指出,Javascript 可以自行完成此操作,根本不需要通过 API 发送文件。

        不允许网页与用户计算机上的文件混在一起(物理文件路径以file:/// 开头),我很高兴它们不是。您希望互联网上的随机人在您的计算机上玩东西吗?你当然不知道。

        幸运的是,您可以使用数据 url(以 data:[MIME type];base64, 开头)访问用户选择上传的任何文件(通过文件输入),并且您可以通过 Javascript 的内置 FileReader 对象获取一个。见下文:

        var previewImage = document.getElementById('my-preview');
        
        var filereader = new FileReader();
        filereader.onload = function (event) {
          var data = event.target.result;
        
          previewImage.src = data;
        };
        
        var file = document.getElementById('file-input').files[0];
        filereader.readAsDataUrl(file);
        

        基本上,这使用FileReader 将用户上传的文件转换为base64 data: URL,您可以随意使用它(&lt;img&gt; 标签不怕将其用作src 属性)。

        这是一场胜利。您已经获得了预览图像,而且您无需绕过合理的浏览器安全措施即可。

        【讨论】:

          【解决方案5】:

          我解决了问题,这是我的控制器方法:

              [HttpPost]
                      public ActionResult UploadFileToTemporaryFolder(HttpPostedFileBase file)
                      {
                          string fileName = String.Empty;
                          string path = String.Empty;
                          if (file != null)
                          {
                              try
                              {
                                 string timestamp = DateTime.UtcNow.ToString("yyyy_MM_dd_HH_mm_ss_fff",CultureInfo.InvariantCulture);
                                 fileName = timestamp + "_" + Path.GetFileName(file.FileName);
                                // Relative Path ex "/uploads/Tmp"
                                 path = Url.Content(ApplicationConfig.TEMPORARY_FILES_UPLOADS_PATH);
                                 System.IO.Directory.CreateDirectory(Server.MapPath(ApplicationConfig.TEMPORARY_FILES_UPLOADS_PATH));
                                 // absolute path : C://........../uploads/Tmp
                                 string fileSystemPath = string.Format("{0}/{1}", Server.MapPath(ApplicationConfig.TEMPORARY_FILES_UPLOADS_PATH), fileName);
                                 file.SaveAs(fileSystemPath);
                              }
                              catch (Exception)
                              {}
                          }
                         // i send the relative path + filename
                          return Json(new { FileName = fileName, FilePath=path }, JsonRequestBehavior.AllowGet);
                      }
          

          我在我的 Js 代码中得到了这样的路径:

          success: function (result) {
                                     if (result.FileName != '') {
          
                                         var fileName = result.FileName;
                                         var filePath = result.FilePath;
          
                                         //alert(filePath );
                                          var imageDiv = '<div>';
                                          imageDiv+='<div style="z-index: 10; position: absolute; top: 4px; left: 10px;">';
                                                  imageDiv += '<a onclick="afficherImage(' + fileName + ')" >Supprimer</a>';
                                               imageDiv +='</div>';
                                               imageDiv += '<img style="width:100%; height:500px" u=image src="' +filePath +'/'+fileName+ '" />';
                                             imageDiv += '</div>';
                                         // Adding Image To the Div 
                                             $('#HotelJustifS').append(imageDiv);
          
                                     }
                                     }
          

          【讨论】:

            【解决方案6】:

            您只需将存储的编码 HTML 字符串中的所有图像网络路径(或本地路径)替换为字节字符串。 为此,您需要 HtmlAgilityPack 将 Html 字符串转换为 Html 文档。 https://www.nuget.org/packages/HtmlAgilityPack

            在下面找到将每个图像 src 网络路径(或本地路径)转换为字节字符串的代码。 它肯定会在IE、chrome和firefox中显示所有带有网络路径(或本地路径)的图像。

            字符串编码HtmlString = Emailmodel.DtEmailFields.Rows[0]["Body"].ToString();

                        // Decode the encoded string.
                        StringWriter myWriter = new StringWriter();
                        HttpUtility.HtmlDecode(encodedHtmlString, myWriter);
                        string DecodedHtmlString = myWriter.ToString();
            
                        //find and replace each img src with byte string
                         HtmlDocument document = new HtmlDocument();
                         document.LoadHtml(DecodedHtmlString);
                         document.DocumentNode.Descendants("img")
                          .Where(e =>
                        {
                            string src = e.GetAttributeValue("src", null) ?? "";
                            return !string.IsNullOrEmpty(src);//&& src.StartsWith("data:image");
                        })
                        .ToList()
                                    .ForEach(x =>
                                    {
                                        string currentSrcValue = x.GetAttributeValue("src", null);                                
                                        string filePath = Path.GetDirectoryName(currentSrcValue) + "\\";
                                        string filename = Path.GetFileName(currentSrcValue);
                                        string contenttype = "image/" + Path.GetExtension(filename).Replace(".", "");
                                        FileStream fs = new FileStream(filePath + filename, FileMode.Open, FileAccess.Read);
                                        BinaryReader br = new BinaryReader(fs);
                                        Byte[] bytes = br.ReadBytes((Int32)fs.Length);
                                        br.Close();
                                        fs.Close();
                                        x.SetAttributeValue("src", "data:" + contenttype + ";base64," + Convert.ToBase64String(bytes));                                
                                    });
            
                        string result = document.DocumentNode.OuterHtml;
                        //Encode HTML string
                        string myEncodedString = HttpUtility.HtmlEncode(result);
            
                        Emailmodel.DtEmailFields.Rows[0]["Body"] = myEncodedString;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-10-08
              • 2016-11-04
              • 1970-01-01
              • 2016-03-03
              • 1970-01-01
              • 2014-12-10
              相关资源
              最近更新 更多