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
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.
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é.
tiliser METADATA
pour importer DLL Constantes - Si vous rencontrez des difficultés pour obtenir la reconnaissance de adTypeBinary
, il est toujours préférable de coder en dur 1
.
Content-Disposition: Quelles sont les différences entre “en ligne” et “pièce jointe”? - Informations utiles sur la manière dont Content-Disposition
Se comporte sur le client.
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
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.
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;
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))