Content-Disposition与302重定向

4

昨晚这个工作正常,但我肯定不小心改变了什么东西,因为现在它不能工作了。

从这些标题中应该可以清楚地看出我想要做什么:

Content-Disposition: attachment;filename=english_customizable.xml
Location: http://tortoisewrath.com/files/2.xml

然而,当发送此标头时,在重定向后Content-Disposition部分不起作用。为什么呢?

2
这两个标题需要分别放在不同的行上,这是发布错误还是真实情况? - sg3s
@sg3s 很抱歉回复晚了,我正在测试那个。我不知道它们需要分别放在不同的行上;然而,我无法弄清如何在 PHP 中使它们分别放在不同的行上。我会继续努力解决这个问题... - Tortoise
好的,我已经解决了那个问题,但是 Content-Disposition 现在不起作用了。我已经在我的问题中更新了新的问题。 - Tortoise
1
实际上,我并不完全清楚您想要实现什么。 - Gumbo
1个回答

2

您试图做的事情是不可取的,可以查看此问题:Header Location + Content Disposition

Content-Disposition + Location header

但是,您可以这样做,为了使其正常工作,您必须在发送整个响应之前缓冲整个响应。您可以使用输出缓冲来实现此目的。

否则,浏览器可能会在文件下载之前解释Location头。无论哪种方式都很棘手,所以您不应该想要这样做。

请注意,使用Content-Disposition: attachment;强制“另存为”将确保客户端不会转到任何地方,因此下面的方法本身应该在任何情况下都可以正常工作。

在PHP中流式传输文件

引用一个头脑清晰的人的话

// To use header() with 'content-type', why don't you use mime_content_type() function rather than checking the type on the basis of extension? 
// Example code: 

<?php 
$file="test.docx"; 
header("Pragma: public"); 
header('Content-disposition: attachment; filename='.$file); 
header("Content-type: ".mime_content_type($file)); 
header('Content-Encoding: identity'); 
ob_clean(); 
flush(); 
readfile($file); 
?> 

// Use $file to map to whichever type of file. 
// Note: the mime types should already be defined in apache settings

来源:http://www.php.net/manual/en/function.header.php#107581

请注意,原始答案使用了在HTTP中实际上不存在的Content-Transfer-Encoding。下面该源代码的评论对此进行了解释:http://www.php.net/manual/en/function.header.php#107044


我在此将您重定向到提问者对该问题所接受答案的评论中:那么对于大约300MB的电影文件,会怎样呢?\: - Tortoise
@Tortoise嗯,可能不会。这就是我谈到它很可疑的原因。而且这也可能是为什么它“不再”工作的原因。 - sg3s
@Tortoise 是的,首先确保输出缓冲已经禁用,然后你可以直接使用 echo file_get_contents(/* 文件路径 */) 将文件流式传输到客户端。这意味着你不能使用 Location 头部了。 - sg3s
“Location”头部并不是必需的,必要的部分是将文件流式传输到客户端。我会告诉你这个方法的效果如何。 - Tortoise
@Tortoise 我根据那个问题更新了我的答案,因为我找到了一个有人思考了两秒以上的方法。 - sg3s
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接