我有一个主要的脑力激荡器。
我想在经典ASP中打开一个文件。我正在使用各种变量,因为事情可能会改变,但结果是正确的。我知道这是因为我通过复制linkadress并将其放入我的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>")
编辑:链接错误/结果的屏幕截图
答案 0 :(得分:8)
现在我们知道实际错误是什么可以形成答案。
不允许加载本地资源
是Chrome和其他现代浏览器中内置的安全例外。措辞可能不同,但在某种形式或形式上,它们都有适当的安全例外来处理这种情况。
过去,您可以覆盖某些设置或应用某些标记,例如
--disable-web-security --allow-file-access-from-files --allow-file-accessChrome中的
(请参阅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
属性在读取块时检查流的结尾。您还可以添加查询字符串参数,以设置是否希望文件以内联方式返回或提示下载。
Using METADATA
to Import DLL Constants - 如果您无法让adTypeBinary
得到认可,请务必使用1
进行硬编码。
Content-Disposition:What are the differences between “inline” and “attachment”? - 有关Content-Disposition
在客户端上的行为的有用信息。
答案 1 :(得分:5)
如果人们不喜欢修改chrome的安全选项,我们只需从包含您本地文件的目录启动python
http服务器:
python -m SimpleHTTPServer
和python 3:
python3 -m http.server
现在,您可以直接从js代码或外部使用http://127.0.0.1:8000/some_file.txt
访问任何本地文件答案 2 :(得分:3)
您必须提供可通过浏览器访问的文件的链接,例如:
<a href="http://my.domain.com/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">
与
<a href="C:/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">
如果你公开你的&#34; Projecten&#34;直接向公众发送文件夹,那么您可能只需要提供这样的链接:
<a href="/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">
但请注意,您的文件可以被搜索引擎编入索引,任何拥有此链接的人都可以访问,等等。
答案 3 :(得分:0)
我从原来的问题中没有意识到你在本地机器上打开文件,我以为你是从网络服务器向客户端发送文件。
根据您的屏幕截图,尝试格式化您的链接:
<a href="file:///C:/Projecten/Protocollen/346/Uitvoeringsoverzicht.xls">Klik hier</a>
(不知道您的每个记录集变量的内容,我无法为您提供准确的ASP代码)
答案 4 :(得分:0)
您只需要将所有图像网络路径替换为HTML字符串中的字节字符串即可。首先,您需要HtmlAgilityPack将HTML字符串转换为HTML文档。 https://www.nuget.org/packages/HtmlAgilityPack
查找以下代码,将每个图像src网络路径(或本地路径)转换为字节字符串。它肯定会在IE,chrome和firefox中显示具有网络路径(或本地路径)的所有图像。
string encodingHtmlString = 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;
答案 5 :(得分:0)
遵循以下步骤,