私は大きな頭の体操を持っています。
クラシックASPでファイルを開きたい。物事は変化する可能性がありますが、結果は正しいため、さまざまな変数を使用しています。これを知っているのは、リンクアドレスをコピーしてURLに配置することで結果をテストしたからです。問題は、リンクをクリックしても何もしないことです。リフレッシュではなく、リダイレクトでもありません。何もない。誰かが私が間違ったことを知っていますか?
OK私のファイルは常にローカルであるとは限りません、それは私がいる環境に依存します。 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>")
編集:リンクのエラー/結果を含むスクリーンショット
これで、実際のエラーが何であるかがわかり、答えを定式化できます。
ローカルリソースの読み込みが許可されていません
Chromeおよびその他の最新のブラウザに組み込まれているセキュリティ例外です。言葉遣いは異なる場合がありますが、何らかの形で、このシナリオに対処するためのセキュリティ例外があります。
以前は、特定の設定をオーバーライドしたり、次のような特定のフラグを適用したりできました。
-disable-web-security --allow-file-access-from-files --allow-file-access
in Chrome( https://stackoverflow.com/a/22027002/692942 )を参照)
理由がある
この時点で、これらのセキュリティ例外が正当な理由で存在することを指摘する価値があり、それらを回避しようとすることは最良のアイデアではありません。
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's no file.
Response.Status = "404 Not Found"
End If
%>
_
この例は疑似コード化されているため、テストされていません。
このスクリプトを_<a>
_で使用すると、リソースを返すことができます。
_<a href="/getfile.asp?id=TESTFILE1">Click Here</a>
_
このアプローチをさらに進め、(特に大きなファイルの場合)_Response.IsConnected
_を使用してチャンクでファイルを読み取り、クライアントがまだ存在するかどうかを確認し、_s.EOS
_チャンクの読み取り中にストリームの終わりを確認するプロパティ。また、クエリ文字列パラメーターに追加して、ファイルをインラインで返すかプロンプトをダウンロードするかを設定することもできます。
METADATA
を使用してインポートするDLL定数 -adTypeBinary
を認識できない場合は、常にハードコーディングよりも優れています_1
_。
Content-Disposition:「インライン」と「添付」の違いは何ですか? -_Content-Disposition
_がクライアント上でどのように動作するかに関する有用な情報。
クロムのセキュリティオプションを変更したくない場合は、ローカルファイルを含むディレクトリからpython
httpサーバーを起動するだけです。
python -m SimpleHTTPServer
およびfor python 3:
python3 -m http.server
これで、jsコードから直接、または http://127.0.0.1:8000/some_file.txt を使用して、ローカルファイルに直接アクセスできます
ブラウザからアクセスできるファイルへのリンクを提供する必要があります。たとえば、次のとおりです。
<a href="http://my.domain.com/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">
versus
<a href="C:/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">
「Projecten」フォルダを直接公開する場合、次のようなリンクのみを提供する必要があります。
<a href="/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">
ただし、検索エンジンでファイルのインデックスを作成したり、このリンクを持っている人なら誰でもアクセスできるなどのことに注意してください。
すべての画像ネットワークパスをHTML文字列のバイト文字列に置き換えるだけです。最初に、Html文字列をHtmlドキュメントに変換するためにHtmlAgilityPackが必要でした。 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;
元の質問から、ローカルマシンでファイルを開いていることに気づきませんでした。Webサーバーからクライアントにファイルを送信していると思いました。
スクリーンショットに基づいて、リンクを次のようにフォーマットしてみてください。
<a href="file:///C:/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">Klik hier</a>
(各レコードセット変数の内容を知らずに、正確なASPコード)を提供することはできません