web-dev-qa-db-fra.com

URL du fichier "Non autorisé à charger la ressource locale" dans le navigateur Internet

J'ai un casse-tête majeur.

Je veux ouvrir un fichier en ASP classique. J'utilise diverses variables car les choses peuvent changer mais le résultat est correct. Je le sais parce que j'ai testé le résultat en copiant l'adresse linkadress et en la plaçant dans mon URL. Maintenant le problème: si je clique sur mon lien, il ne fait rien. Pas une actualisation, pas une redirection. rien. Est-ce que quelqu'un sait ce que j'ai mal fait?

Ok voici l'affaire. Mon fichier n'est pas toujours local, cela dépend de l'environnement dans lequel je suis. Si je copie-colle le résultat de mon URL, il se télécharge. Si je clique sur mon URL, il ne répond pas. Des idées? Problème de navigateur? (bien que j'ai testé 5 navigateurs) Ou autre chose? Je suis vraiment coincé ici et Internet ne semble pas être de mon côté.

J'ai 3 environnements. Les variables ci-dessous sont telles que le lien fonctionne. Je sais que le lien fonctionne parce que je l'ai testé en le copiant. Et oui, ça commence par file:/// et oui je suis sûr que le lien est correct.

Voici ma ligne de code:

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: Capture d'écran avec erreur/résultat du lien

error

13
Benny Niemeijer

Nous savons maintenant quelle est l’erreur réelle et que nous pouvons formuler une réponse.

Non autorisé à charger la ressource locale

est une exception de sécurité intégrée à Chrome et à d'autres navigateurs modernes. Le libellé peut être différent, mais d'une manière ou d'une autre, ils ont tous des exceptions de sécurité en place pour gérer ce scénario.

Dans le passé, vous pouviez remplacer certains paramètres ou appliquer certains indicateurs tels que

 - désactiver-la-sécurité-Web --aller-le-fichier-à partir de fichiers --aller-le-fichier 

in Chrome (Voir https://stackoverflow.com/a/22027002/692942 =))

C'est pour une raison

À ce stade, il convient toutefois de souligner que ces exceptions de sécurité existent pour une bonne raison. Il n'est pas recommandé d'essayer de les contourner.

Il y a une autre façon

Comme vous avez accès à Classic ASP, vous pouvez déjà créer une page intermédiaire qui sert les fichiers du réseau. Pour ce faire, utilisez une combinaison de l’objet ADODB.Stream Et du Response.BinaryWrite() Cette opération garantit que les emplacements de fichiers réseau ne sont jamais exposés au client et, en raison de la souplesse du script, il peut être utilisé pour charger des ressources à partir de plusieurs emplacements et de plusieurs types de fichiers.

Voici un exemple de base (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's no file.
  Response.Status = "404 Not Found"
End If
%>

Cet exemple est pseudo-codé et, en tant que tel, non testé.

Ce script peut ensuite être utilisé dans <a> Comme ceci pour renvoyer la ressource;

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

Le pourrait prendre cette approche plus loin et considérer (en particulier pour les fichiers plus volumineux) lire le fichier par morceaux en utilisant Response.IsConnected Pour vérifier si le client est toujours là et s.EOS propriété pour vérifier la fin du flux pendant la lecture des morceaux. Vous pouvez également ajouter aux paramètres de chaîne de requête pour définir si vous souhaitez que le fichier soit renvoyé en ligne ou que l'invite soit téléchargé.


Liens utiles

11
Lankymart

Pour ceux qui n'aiment pas modifier les options de sécurité de chrome, nous pouvons simplement démarrer un serveur python http à partir du répertoire qui contient votre fichier local:

python -m SimpleHTTPServer

et pour python 3:

python3 -m http.server

Vous pouvez maintenant accéder à n’importe quel fichier local directement à partir de votre code js ou en externe avec http://127.0.0.1:8000/some_file.txt

5
alix

Vous devrez fournir un lien vers votre fichier accessible via le navigateur, par exemple:

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

versus

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

Si vous exposez votre dossier "Projecten" directement au public, il vous suffira de fournir le lien en tant que tel:

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

Mais attention, vos fichiers peuvent ensuite être indexés par les moteurs de recherche, accessibles à quiconque ayant ce lien, etc.

3
gpinkas

Il vous suffit de remplacer tous les chemins réseau de l'image par des chaînes d'octets dans une chaîne HTML. Pour cela, vous avez d'abord demandé à HtmlAgilityPack de convertir une chaîne HTML en document HTML. https://www.nuget.org/packages/HtmlAgilityPack

Recherchez le code ci-dessous pour convertir chaque chemin d'accès réseau (ou local) de l'image src en octets. Il affichera définitivement toutes les images avec chemin réseau (ou chemin local) dans IE, Chrome et 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;
0

D'après votre question initiale, je n'avais pas compris que vous ouvriez un fichier sur l'ordinateur local. Je pensais que vous envoyiez un fichier du serveur Web au client.

Sur la base de votre capture d'écran, essayez de formater votre lien de la manière suivante:

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

(sans connaître le contenu de chacune de vos variables de jeu d'enregistrements, je ne peux pas vous donner l'exact ASP code))

0
Rich