AJAX + FormData 上传文件失败?

发布于 2022-09-02 20:17:15 字数 2205 浏览 15 评论 0

做了一个上传头像的功能,先选择头像(用按钮代替了丑陋的input),选择文件成功,用 input onchange() 句柄 做的预览图片功能也成功,确认上传的时候,想用AJAX,从
有什么方法能ajax上传文件呢 ?

了解到可以用 原生JS + FormData 上传。点击按钮,POST返回301,POST的内容很丰富,应该是发送成功了;响应返回200,应该也是成功了。

但是服务器的特定路径里就是没有上传的文件,请问为什么?

代码如下:

<!DOCTYPE html>
<html>
    <head>
    <title>TODO supply a title</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        function loading()
        {
        upload_thumbnail();
        }
        
        function upload_thumbnail()
        {
        var upload_thumbnail_node = document.getElementById('upload_thumbnail');            // 选择文件按钮
        var upload_thumbnail_input = document.getElementById('upload_thumbnail_input');        // input file
        var thumbnail_node = document.getElementById('thumbnail');                    // 图片预览
        var upload_thumbnail_submit_node = document.getElementById('upload_thumbnail_submit');  // 确认上传按钮
        
        upload_thumbnail_node.onclick = function()// 按钮代替 input
        {
            upload_thumbnail_input.click();// 打开文件管理器
            upload_thumbnail_input.onchange = function()// 图片预览
            {
            thumbnail_node.src = window.URL.createObjectURL(upload_thumbnail_input.files[0]);
            };
        };
        upload_thumbnail_submit_node.onclick = function()// 上传
        {
            var xml = new XMLHttpRequest();
            var form_obj = new FormData();
            var file = upload_thumbnail_input.files[0];

            form_obj.append('file',file);
            xml.open("POST","./save/thumbnail");
            xml.send(form_obj);
            alert("success!");
        };
        }
    </script>
    </head>
    <body onload="loading();">
    <img id="thumbnail" src="" alt="预览图片" />
    <span id="upload_thumbnail">选择头像</span>
    <span id="upload_thumbnail_submit">确认上传</span>
    <input id="upload_thumbnail_input" type="file">这个input应该是隐藏的,但是为了找bug,就显示出来了
    </body>
</html>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

似最初 2022-09-09 20:17:15

我测试过了,你这些代码应该是没有什么大问题的,如果有的话,可能在两个地方:
1是:xml.open("POST","./save/thumbnail"); 这个地方,那个地址是不是有效地址?比如,如果后端用php的话,地址应该是类似这样:./save/thumbnail.php

2.是你后端的实现代码有问题,不知你后端是直接显示信息,还是保存了图片。如果是直接显示的话,你应该是看不到的,这时你的前端需要添加一些代码才能看到后端是否已经接收到。

  upload_thumbnail_submit_node.onclick = function()// 上传
        {
            var xml = new XMLHttpRequest();
            var form_obj = new FormData();
            var file = upload_thumbnail_input.files[0];

            form_obj.append('file',file);
            xml.open("POST","./save.php");
            
            //看一下后端有没有接收到文件
            xml.onreadystatechange=function() {
              if (xml.readyState==4 && xml.status==200){
                console.log(xml.responseText);
                }
              }
            //添加以上这一段看看后端返回的信息

            xml.send(form_obj);
            alert("success!");
        };

我用的是php,在./save.php这个文件里就简单一点:

<?php 

var_dump($_FILES);

?>

测试的效果如图:
图片描述

空城缀染半城烟沙 2022-09-09 20:17:15

什么叫post返回301,响应返回200?这些都是HTTP Status code么?不应该吧

蓝天 2022-09-09 20:17:15

301说明上传路径被服务器跳转了, 肯定是失败了...

类似是上传时没登录, 被服务器跳到登录页面

神仙妹妹 2022-09-09 20:17:15

建议用现成的上传插件

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文