PHP header(“Location:..”)无法正确使用axios [重复]

zdwk9cvp  于 11个月前  发布在  iOS
关注(0)|答案(1)|浏览(111)

此问题在此处已有答案

PHP header() doesnt redirects after ajax is called(3个答案)
昨天就关门了。
我遇到了PHP头文件的问题(标题(“位置:......”))与HTML表单和Axios结合使用。当使用Axios发布表单数据时会出现这个问题。在我的PHP脚本中,我有一个if条件来检查表单输入是否为空。当我的上传按钮的类型设置为“button”并且我填充了所有输入时,一切都运行得很顺利,并将数据成功存储到数据库中。
然而,当我将一个或多个输入留空时,数据库中没有插入任何内容,URL也不会像预期的那样更改为“index.php?empty”。奇怪的是,当按钮类型更改为“submit”时,我选择了一个图像,但没有填充文本输入,URL会正确更改为“index.php?empty”。然而,如果我在不选择图像的情况下填充文本输入,则URL将变为“direct.php”,并且只有文本数据(不包括图像)被存储在数据库中。
PHP头文件(“Location:...”)在这个场景中似乎没有按预期的方式工作。如果有任何解决这个问题的建议或解决方案,我们将不胜感激。感谢大家的宝贵时间。(注意,我使用的是两个库axios和compressorjs)

<body>
    <form action="direct.php" method="post" enctype="multipart/form-data">
        <div class="mainimg">
            <input type="file" id="file" accept="image/*" name="file" onchange="compressImg()">
        </div>
        <div class="test">
            <input type="text" name="test">
        </div>
        <button type="button" onclick="uploadData()">Upload</button>
    </form>

    <script src="compressorjs-main/dist/compressor.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.6.3/axios.min.js"></script>
    <script>
        let formData; 

        function compressImg() {
            const fileInput = document.getElementById('file');
            const file = fileInput.files[0];

            if (!file) {
                return;
            }

            new Compressor(file, {
                quality: 0.6,
                maxWidth: 700,
                maxHeight: 700,
                success(result) {
                    formData = new FormData();
                    console.log('Original Size:', file.size);
                    console.log('Compressed Size:', result.size);
                    console.log("Image name after compression", result.name);

                    formData.delete('file');
                    formData.append('file', result, result.name);
                },
                error(err) {
                    console.log(err.message);
                },
            });
        }

        function uploadData() {

            if (formData) {

                formData.append('test', document.querySelector('[name="test"]').value);

                axios.post('direct.php', formData).then(() => {
                    console.log('Upload success');
                    console.log(formData);
                });
            } else {
                console.log('No data to upload');
            }
        }

个字符

nwo49xxi

nwo49xxi1#

URL没有按预期更改为“index.php?empty”
.不,这不是预期的。异步AJAX请求(这是您的Axios正在做的)不会自动读取服务器端的Location标头并向指定的URL发出请求。然而,如果您发出非AJAX请求(例如通过提交表单或单击链接),则浏览器将自动跟随响应中的任何Location标头。
那么为什么Axios/AJAX请求不自动跟随链接呢?这是因为这样的请求被设计为异步的,并在后台运行,使程序员能够保持浏览器在同一页面上,同时仍然与服务器通信。(在AJAX发明之前,对服务器的每个请求都必须涉及页面的完全刷新,这通常会导致较差的用户体验,和/或更复杂的代码库以处理特定功能)。
如果您想在某些情况下在这样的异步请求之后将用户导航到新URL,那么简单的解决方案是在异步请求完成后运行的回调中使用JavaScript完成。
在你的例子中,你需要PHP向客户端指出验证失败,这样它才能采取适当的行动。因此你可以写这样的代码:

if(empty($compressedImage) || empty($test)){
    echo "0";
}

字符串
然后在JavaScript中:

axios.post('direct.php', formData).then((response) => {
    if (response == "0") {
      window.location.href = "index.php?empty";
    }
    else {
      console.log('Upload success');
      console.log(response);
    }
});

相关问题