问题 从解压缩下载的文件中禁用safari


我在Safari中加密的zip下载有一个小问题。我已设置所有适当的标题以强制下载,但是当文件下载的Safari尝试解压缩时会导致文件损坏。我读过的是因为Safari将文件标记为安全,然后尝试打开它。

有没有办法在下载后禁用Safari打开文件?


12856
2017-11-24 20:07


起源

Safari有一个选项“下载后打开安全文件”我认为如果没有客户端改变此设置,就不可能保持safari不这样做 - matteok
@Burbas:你试过为文件提供不正确的MIME类型吗?即没有 application/zip, application/octet-stream - o.v.


答案:


你无法禁用此服务器端:(

在下载后解压缩档案是Safari的默认行为。这可以在Safari中禁用: Preferences  - > General  - >取消选中此框 Open "safe" files after downloading 在底部。但这取决于用户自己做到这一点。

如果您愿意,可以在下载页面上显示有关此行为的警告。

PS:拉链不会消失! Safari可以(可选)解压缩,但下载的zip仍然会在解压缩的文件夹旁边。


10
2017-11-27 18:53



谢谢你的回复。虽然如此,但需要确定:-) - Burbas
对我来说,zip文件似乎被删除了。只剩下文件夹了 - Lars Ebert
(我知道它已经过时了,但这是谷歌的最佳结果)如果您在自动解压缩后找不到.zip,请务必检查您的垃圾箱。 - Jonas D.


绝对不是最优雅的版本,但您最终可能会使用浏览器联结并让您的下载脚本更改附件名称以及Safari用户的通知:

<?php

// $attachmentId used later-on would be a passed parameter that is used 
// to define attachment name

$attachmentId= $_GET['id'];

$userAgent = $_SERVER['HTTP_USER_AGENT']; 
if (strpos($userAgent , 'Chrome') === FALSE && 
strpos($userAgent , 'Safari') !== FALSE)
{
  $attachmentName= 'download.zipname';
  $userNotice= 'SAFARI users: please rename the file from download.zipname to download.zip (due to Safari\'s ZIP file policy (more info))';
} else {
  $attachmentName= 'download.zip';
  $userNotice= '';
}
?>
<span class="notice"><?php print $userNotice; ?></span>
<a href="download.php?id=<?php print $attachmentId;?>" name="<?php print $attachmentName; ?>">Download</a>

因此,基本上在开始下载之前,您将设置此预下载页面以定义所需的附件名称,并通知safari用户有关成功下载文件必须执行的操作。


5
2017-11-27 16:05



您甚至可以在其他情况下为非Safari浏览器开始下载(使用 header(), echo() 和 exit())所以页面只会显示给Safari用户。 - SaschaM78
感谢您的回复。这可能是我需要采取的方向,向Safari用户显示一个丑陋的信息框:-) - Burbas
@Burbas:我喜欢这个。也许完全放弃通知,只是用别名扩展保存它? - o.v.


我很害怕,但你不能在服务器端工作。

你无能为力。用户可以使用WinZip或其他软件检查或取消选中以打开下载的文件。

我们可以做的最多就是向他们展示警报/弹出窗口,建议使用这种格式不安全或类似的东西。


1
2017-12-02 07:11





你可以使用jQuery,在safari中你可以隐藏或取消隐藏按钮或更改一个按钮的事件等。

if (jQuery.browser.mozilla){  
           // insert you code here
else if (jQuery.browser.msie){  
                        // insert you code here  
else if (jQuery.browser.safari){  
                        // insert you code here 
else if (jQuery.browser.opera){  
                 // insert you code here
} else {  
                       // insert you code here 
}); 

-1
2017-11-29 18:59



这根本不能回答这个问题。 - Jonathan Arkell