我在隐藏的textarea中有一些文本.单击按钮时,我希望将文本提供下载为.txt文件.这可能使用AngularJS或Javascript吗?
我编写了一个PHP脚本来处理文件下载,确定正在请求的文件,并设置正确的HTTP头以触发浏览器实际下载文件(而不是在浏览器中显示).
我现在遇到一个问题,其中一些用户报告某些文件被错误识别(因此无论扩展名如何,浏览器都会将其视为GIF图像).我猜这是因为我没有在响应头中设置"Content-type".这种情况最有可能发生吗?如果是这样,是否有一个可以用于所有文件的相当通用的类型,而不是试图考虑每种可能的文件类型?
目前我只设置值"Content-disposition:attachment; filename = arandomf.ile"
更新:我在此处按照本指南构建了一个更强大的文件下载过程(http://w-shadow.com/blog/2007/08/12/how-to-force-file-download-with-php/) ,但是在执行脚本和显示浏览器的下载对话框之间存在明显的延迟.任何人都可以找出造成这种情况的瓶颈吗?
这是我的实现:
/**
* Outputs the specified file to the browser.
*
* @param string $filePath the path to the file to output
* @param string $fileName the name of the file
* @param string $mimeType the type of file
*/
function outputFile($filePath, $fileName, $mimeType = '') {
// Setup
$mimeTypes = array(
'pdf' => 'application/pdf',
'txt' => 'text/plain',
'html' => 'text/html',
'exe' => 'application/octet-stream',
'zip' => 'application/zip',
'doc' => …Run Code Online (Sandbox Code Playgroud) 伙计们,我知道有很多关于强制下载对话框弹出的线程,但是没有一个解决方案适合我.
我的应用程序将邮件发送到用户的电子邮件帐户,通知他们"另一个用户向他们发送了一条消息".这些消息可能包含指向Excel文件的链接.当用户点击其GMail/Yahoo Mail/Outlook中的链接到该Excel文件时,我希望弹出"文件保存"对话框.
问题:当我右键单击并在IE上执行"另存为"时,我会看到"另存为"对话框.当我点击链接(我的许多客户将会这样做,因为他们不懂电脑)时,我收到一条IE错误消息:"IE无法从...下载文件".可能是相关的:在我测试这个的GMail上,每个链接都是一个"target = _blank"链接(谷歌强制).
所有其他浏览器在所有情况下都能正常工
这是我的标题(通过Fiddler捕获):
HTTP/1.1 200 OK
Proxy-Connection: Keep-Alive
Connection: Keep-Alive
Content-Length: 15872
Via: **** // proxy server name
Expires: 0
Date: Tue, 20 Oct 2009 22:41:37 GMT
Content-Type: application/vnd.ms-excel
Server: Apache/2.2.11 (Unix) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i mod_python/3.3.1 Python/2.5.2 SVN/1.4.6 mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0
Cache-Control: private
Pragma: no-cache
Last-Modified: Tue, 20 Oct 2009 22:41:37 GMT
Content-Disposition: attachment; filename="myFile.xls"
Vary: Accept-Encoding
Keep-Alive: timeout=5, max=100
Run Code Online (Sandbox Code Playgroud)
我希望IE的常规左键单击行为能够正常工作.有任何想法吗?
我正在Intranet上工作,并且使用IE可以打开本地Office安装的文档存在一些问题。
我使用以下锚标记为用户提供文件:
<a target="_blank" download="{{fileName}}" href="{{filePath}}">
Run Code Online (Sandbox Code Playgroud)
当用户单击此链接时,IE会为用户提供打开或保存它的决定。如果用户选择打开文件,然后决定他/她想要编辑文件,则他们在Office应用程序顶部单击“启用编辑”。这给用户一个错误,因为Office应用程序无法连接到站点并获取用户要编辑的文件。
Office应用程序名称无法连接到(我的文件)...
我要做的是让用户编辑他们在网上找到的文档的副本。然后他们可以保存副本,然后重新上传。
我认为问题之一是文件受登录保护。也许Intranet正在SSL上运行。
在研究问题的解决方案时,我从Microsoft找到了此支持页面,该页面讨论了我正在经历的事情。他们在错误消息三中写道:
Office应用程序名称无法打开文件。
就我而言,我得到的信息是:
Office应用程序名称无法连接到(我的文件)...
几乎相同,Microsoft写道,一个问题可能是:
当Internet Explorer通过SSL与安全网站通信时,Internet Explorer会强制执行任何无缓存请求。如果存在一个或多个标题,则Internet Explorer不会缓存该文件。因此,Office无法打开该文件。
这让我开始思考,然后我开始研究此问题,找到StackOverflow页面,例如“如何为每个文件夹配置静态内容缓存...”和“利用IIS中的浏览器缓存”。我还检查了《 IIS.net配置参考》,以查看此处是否有任何可以帮助我解决问题的内容。
我认为主要的问题是,打开文件时,该文件未保存在本地,因此Office应用程序无法对其进行编辑。到目前为止,我认为解决此问题的方法是删除无缓存头,而对文件使用某种短缓存,以便浏览器强制下载该文件。
我尝试了链接的前两篇SO文章中的技术,尝试在web.config中设置静态文件的缓存,但是强制缓存没有任何改变(当我询问时,我使用此技术来确保缓存控件正确无误文件)。Office应用程序仍尝试从其无权访问的网页打开文件。
我尝试的另一件事是强制Internet Explorer下载该文件。完全删除该选项以将其打开。Microsoft也有关于它的支持页面。但这似乎没有用。在Global.asax中,我尝试了以下代码(只是看是否可以使Word文件正常工作):
<script runat="server">
void Application_PreSendRequestHeaders(Object sender, EventArgs e) {
Response.Headers.Set("Content-Type", "application/ms-word");
Response.Headers.Set("Content-Disposition", "attachment; filename=fname.ext");
}
</script>
Run Code Online (Sandbox Code Playgroud)
但这只会使Internet Explorer尝试下载我尝试访问的所有页面。
我们总是检查用户是否确实有权访问所请求的文件。我们不希望人们窥探其他文件。禁用此检查将导致所有Office应用程序都可以在用户要编辑文件时打开文件。但这是一个糟糕的解决方案,并且带来了很多安全问题。
所以我的问题是,“如何启用在IE中从受登录保护的Intranet打开的Office文档中进行编辑?” 如果与缓存有关,那么我该如何解决?当用户选择“打开”文件时,是否可以通过某种方式告诉IE保存本地副本,以及如何告诉Office应用程序查找文件的本地缓存版本,而不是尝试从中下载文件?服务器?
我将问题缩小为Office应用程序的身份验证。当我单击Office应用程序中的“启用编辑”按钮时,该应用程序正在尝试下载文件,以便它可以编辑文件。然后,该请求被服务器拒绝(服务404),因为Office应用程序未登录,并且没有任何类型的cookie来告知服务器实际上确实可以访问该文件。这导致用户收到一条消息,通知用户无法打开请求的文件。
download ×2
php ×2
.net ×1
angularjs ×1
c# ×1
content-type ×1
file ×1
http-headers ×1
iis ×1
javascript ×1
ms-office ×1