如何解决为什么随后下载特定文件时,我在React Native中收到HTTP 412状态错误?
我创建了一个React Native App,可以将Zip包下载到我的应用程序中。在大多数情况下,它可以工作,我可以下载zip软件包,删除zip软件包,然后再次重新下载。但是,使用我的一个zip文件时,我遇到以下问题:
- 我下载并安装了zip包
- 我删除了zip包
- 我尝试再次下载它,但这次却出现412错误。
无论我尝试重新下载多少次,它都不会允许我。为了克服这个问题,我然后执行以下操作:
- 用其他一个zip文件替换服务器上的zip文件
- 现在下载就可以了
- 我从应用程序中删除了包
- 我用原始文件替换了服务器上的zip文件
- 我现在可以很好地下载zip包
这一次有效,但是如果我删除它并尝试再次安装它,那么它将再次让我失望。
我也尝试了另一种方法,在这种情况下,我用问题zip文件替换了其他zip文件。同样,它可以让我下载一次,但是如果以后要下载,则不会让我下载。
为什么这个zip文件有这个问题?压缩文件的制作方法完全相同,首次下载似乎没有问题。
起初我以为这是一个缓存问题,但是为什么问题只与这个特定文件有关?
该zip文件是通过PHP编程创建的,并与Apache一起提供。但是,我也从命令提示符处手动创建了它,问题仍然存在。
我的代码:
let response = await RNFetchBlob.config({
path: temp_file,})
.fetch(
"POST","https://example.com/apptools/getZipPack.php",{
"Accept": "application/json","Content-Type": "application/json",},JSON.stringify({
passcode: passcode,group_id: group_id,file: group.zp,})
)
.progress((received,total) => {
console.log("progress",received / total);
this.setState({
progress_num: (received / total) * 100,});
});
我收到的回复:
{“数组”:[匿名函数],“ base64”:[匿名函数], “ blob”:[匿名函数],“ data”: “ /Users/MyUserName/Library/Developer/CoreSimulator/Devices/940349C9-94F7-4EC7-95AC-31034876935D/data/Containers/Data/Application/C79E45D8-4D56-4BF9-9C2B-8846C58DE4F9/Documents/temp/45.zip” , “ flush”:[匿名函数],“ info”:[匿名函数],“ json”: [匿名函数],“路径”:[匿名函数],“ readFile”: [匿名函数],“ readStream”:[匿名函数],“ respInfo”: {“标题”:{“连接”:“保持活动”,“内容处置”: “ attachment; filename =” 45_1.0.8_105.zip“”,“ Content-Length”:“ 0”, “内容类型”:“应用程序/八位字节流”,“日期”:“ 2020年9月17日,星期四 19:28:09 GMT”,“ Etag”:““ 75cf8-5af85fff34576””,“ Keep-Alive”: “ timeout = 3,max = 100”,“最后修改”:“ Thu,2020年9月17日17:49:03 GMT”,“服务器”:“ Apache / 2.4.25(Debian)”},“重定向”: [“ https://example.com/apptools/getZipPack.php”],“ respType”:“ blob”, “ rnfbEncode”:“路径”,“ state”:“ 2”,“ status”:412,“ taskId”: “ k4zitpcob29hhrzk245n5n”,“超时”:false},“会话”:[功能 匿名],“ taskId”:“ k4zitpcob29hhrzk245n5n”,“文本”:[功能 匿名],“类型”:“路径”}
请注意,内容长度为0,状态为412。
一个zip文件放置在我为其创建的目录中,但是它的大小为0个字节。
后端脚本(PHP)中的相关部分是:
header("X-Sendfile: $full_path");
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
PHP脚本确实可以在文件系统中找到文件。但是,我不确定是服务器还是应用程序出现故障。我的猜测是它与应用程序有关。我的第一个假设是它与缓存有关,但是为什么它只影响这个文件而不影响其他文件?
我为什么会遇到此问题以及如何解决?
解决方法
这似乎正在发生:
-
使用
X-Sendfile
会触发ETag
的生成,尽管通常不会缓存POST
响应。 -
React Native客户端缓存响应,可能是由于
ETag
的存在。当缓存条目过期后再次访问该资源时,它将发送conditional request。因为这是POST
,所以它使用If-Match
标头(用于有条件地更新资源)完全不是您要执行的操作。 -
服务器看到
If-Match
标头,并尝试进行条件更新。也就是说,只有旧的POST
与当前的ETag
匹配时,它才会执行412 Precondition Failed
。如果不是这种情况,它将返回Cache-Control: no-store
响应。
由于您说过不想在此处使用缓存,所以最简单的解决方案可能是在响应中添加ETag
。这可能会阻止Apache完全生成{{1}},但是无论如何,它肯定会阻止客户端存储响应,从而确保它无法发送任何条件请求。
您可以尝试将内容类型修改为:
fetch("https://example.com/apptools/getZipPack.php",{
method: "POST",headers:{
'Content-Type': 'multipart/form-data',},})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。