URL-адрес файла "Не разрешено загружать локальный ресурс" в Интернет-браузере

У меня есть главный собеседник.

Я хочу открыть файл в классическом ASP. Я использую различные переменные, потому что все может измениться, но результат правильный. Я знаю это, потому что я проверил результат, скопировав ссылку-ссылку и поместив ее в свой URL-адрес. Теперь проблема: если я нажму ссылку, это ничего не сделает. Не обновление, не перенаправление. ничего. Кто-нибудь знает, что я сделал не так?

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

У меня 3 среды. Переменные внизу здесь так, что ссылка работает. Я знаю, что ссылка работает, потому что я протестировал ее, скопировав ее. И да, это начинается с file:/// и да, я уверен, что ссылка правильная.

Здесь моя строка кода:

response.write("<td class='tab_kolom2'><a href='"&rootRs("pre_rootpad")&rootRs("rootpad_protocollen")&"\"&overzichtRs("Formuliernr")&"\Uitvoeringsoverzicht.xls' target='_blank' download>Click here</a></td>")

EDIT: Снимок экрана с ошибкой/результатом ссылки

error

Ответ 1

Теперь мы знаем, что такое настоящая ошибка, можем сформулировать ответ.

Не разрешено загружать локальный ресурс

исключение безопасности, встроенное в Chrome и другие современные браузеры. Формулировка может быть другой, но в некотором роде или форме они все имеют исключения безопасности для решения этого сценария.

В прошлом вы могли отменять определенные настройки или применять определенные флаги, такие как

--disable-web-security --allow-file-access-from-files --allow-file-access

в Chrome (см. fooobar.com/questions/625206/...)

Это там по причине

На данный момент, хотя стоит отметить, что эти исключения безопасности существуют по уважительной причине, и попытка их обойти не лучшая идея.

Есть другой способ

Поскольку у вас уже есть доступ к Classic ASP, вы всегда можете создать промежуточную страницу, которая обслуживает сетевые файлы. Это делается с помощью комбинации объекта ADODB.Stream и метода Response.BinaryWrite(). Это гарантирует, что расположение ваших сетевых файлов никогда не будет открыто клиенту, и благодаря гибкости сценария его можно использовать для загрузки ресурсов из нескольких расположений и файлов разных типов.

Вот базовый пример (getfile.asp);

<%
Option Explicit

Dim s, id, bin, file, filename, mime

id = Request.QueryString("id")

'id can be anything just use it as a key to identify the 
'file to return. It could be a simple Case statement like this
'or even pulled from a database.
Select Case id
Case "TESTFILE1"
  'The file, mime and filename can be built-up anyway they don't 
  'have to be hard coded.
  file = "\\server\share\Projecten\Protocollen\346\Uitvoeringsoverzicht.xls"     
  mime = "application/vnd.ms-excel"
  'Filename you want to display when downloading the resource.
  filename = "Uitvoeringsoverzicht.xls"

'Assuming other files 
Case ...
End Select

If Len(file & "") > 0 Then
  Set s = Server.CreateObject("ADODB.Stream")
  s.Type = adTypeBinary 'adTypeBinary = 1 See "Useful Links"
  Call s.Open()
  Call s.LoadFromFile(file)
  bin = s.Read()

  'Clean-up the stream and free memory
  Call s.Close()
  Set s = Nothing

  'Set content type header based on mime variable
  Response.ContentType = mime
  'Control how the content is returned using the 
  'Content-Disposition HTTP Header. Using "attachment" forces the resource
  'to prompt the client to download while "inline" allows the resource to
  'download and display in the client (useful for returning images
  'as the "src" of a <img> tag).
  Call Response.AddHeader("Content-Disposition", "attachment;filename=" & filename)
  Call Response.BinaryWrite(bin)
Else
  'Return a 404 if there no file.
  Response.Status = "404 Not Found"
End If
%>

Этот пример псевдокодирован и как таковой не проверен.

Затем этот скрипт можно использовать в <a> чтобы вернуть ресурс;

<a href="/getfile.asp?id=TESTFILE1">Click Here</a>

Можно было бы продолжить этот подход и рассмотреть (особенно для больших файлов) чтение файла в чанках, используя Response.IsConnected чтобы проверить, все ли еще клиент, и свойство s.EOS чтобы проверить конец потока во время чтения чанков., Вы также можете добавить к параметрам строки запроса, чтобы указать, хотите ли вы, чтобы файл возвращался в строке или предлагал загрузить.


Полезные ссылки

Ответ 2

Для людей, не желающих изменять параметры защиты chrome, мы можем просто запустить http-сервер python из каталога, который содержит ваш локальный файл:

python -m SimpleHTTPServer

и для python 3:

python3 -m http.server

Теперь вы можете связаться с любым локальным файлом непосредственно из вашего js-кода или извне http://127.0.0.1:8000/some_file.txt

Ответ 3

Вам нужно будет предоставить ссылку на ваш файл, доступный через браузер, например:

<a href="http://my.domain.com/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">

против

<a href="C:/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">

Если вы публикуете свою папку "Projecten" непосредственно для публики, вам может потребоваться предоставить ссылку как таковую:

<a href="/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">

Но будьте осторожны, чтобы ваши файлы могли быть проиндексированы поисковыми системами, к ним может обращаться любой, имеющий эту ссылку, и т.д.

Ответ 4

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

На основе снимка экрана попробуйте форматировать свою ссылку:

<a href="file:///C:/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">Klik hier</a>

(не зная содержимого каждой из ваших переменных набора записей, я не могу дать вам точный код ASP)

Ответ 5

Вам просто нужно заменить все пути к сетям изображений на строки байтов в сохраненном кодированном HTML-коде. Для этого вам понадобился HtmlAgilityPack для преобразования строки HTML в документ HTML. https://www.nuget.org/packages/HtmlAgilityPack

Найдите код ниже, чтобы преобразовать каждый сетевой образ (или локальный путь) src в байтовый код. Он определенно отобразит все изображения с сетевым путем (или локальным путем) в IE, Chrome и Firefox.

string encodedHtmlString = 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;

Ответ 6

Вам просто нужно заменить все пути к сетям изображений на строки байтов в строке HTML. Для этого сначала вам понадобился HtmlAgilityPack для преобразования строки HTML в документ HTML. https://www.nuget.org/packages/HtmlAgilityPack

Найдите код ниже, чтобы преобразовать каждый сетевой образ (или локальный путь) src в байтовый код. Он определенно отобразит все изображения с сетевым путем (или локальным путем) в IE, Chrome и Firefox.

string encodedHtmlString = 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;