为什么我无法通过ajax在我的php中获取上传的文件?

13 浏览
0 Comments

为什么我无法通过ajax在我的php中获取上传的文件?

我想在我的内部网页中实现一个简单的文件上传,使用尽可能简单的设置。

这是我的HTML部分:



这是我的JS jquery脚本:

$("#upload").on("click", function() {
    var file_data = $("#sortpicture").prop("files")[0];   
    var form_data = new FormData();
    form_data.append("file", file_data);
    alert(form_data);
    $.ajax({
        url: "/uploads",
        dataType: 'script',
        cache: false,
        contentType: false,
        processData: false,
        data: form_data,                         
        type: 'post',
        success: function(){
            alert("成功"); 
        }
    });
});

在网站根目录中有一个名为"uploads"的文件夹,"users"和"IIS_users"具有更改权限。

当我选择一个文件并按下上传按钮时,第一个警告返回"[object FormData]"。第二个警告没有被调用,"uploads"文件夹也是空的!?

有人可以帮我找出问题吗?

另外下一步应该是用服务器端生成的名称重命名文件。也许有人可以给我一个解决方案。

0
0 Comments

问题:为什么我在使用PHP和Ajax时无法获取上传的文件?

原因:没有正确处理文件上传请求以及没有设置正确的请求头。

解决方法:使用FormData对象将文件添加到请求体中,并设置正确的请求头。

使用纯JS的解决方法:

async function saveFile() {
    let formData = new FormData();           
    formData.append("file", sortpicture.files[0]);
    await fetch('/uploads', {method: "POST", body: formData});    
    alert('works');
}



Before click upload look on chrome>console>network (in this snipped we will see 404)

更详细的解决方法包括错误处理和发送额外的JSON数据:

async function saveFile(inp) {
    let user = { name:'john', age:34 };
    let formData = new FormData();
    let photo = inp.files[0];      
         
    formData.append("photo", photo);
    formData.append("user", JSON.stringify(user));  
    
    try {
       let r = await fetch('/upload/image', {method: "POST", body: formData}); 
       console.log('HTTP response code:',r.status); 
       alert('success');
    } catch(e) {
       console.log('Huston we have problem...:', e);
    }
}



Before selecting the file Open chrome console > network tab to see the request details.

Because in this example we send request to https://stacksnippets.net/upload/image the response code will be 404 of course...

通过使用以上的解决方法,可以正确处理文件上传请求并获取上传的文件。

0
0 Comments

问题:为什么在使用Ajax上传文件时,我无法获取上传的文件?

原因:需要在服务器上运行的脚本来将文件移动到上传目录。jQuery的Ajax方法(在浏览器中运行的客户端)将表单数据发送到服务器,然后服务器上运行的脚本处理上传。

解决方法:更新JS jQuery脚本,使其如下所示:

$('#upload').on('click', function() {
    var file_data = $('#sortpicture').prop('files')[0];   
    var form_data = new FormData();                  
    form_data.append('file', file_data);
    alert(form_data);                             
    $.ajax({
        url: 'upload.php',
        dataType: 'text',
        cache: false,
        contentType: false,
        processData: false,
        data: form_data,                         
        type: 'post',
        success: function(php_script_response){
            alert(php_script_response);
        }
    });
});

然后,在服务器端使用PHP编写以下脚本:


还要注意以下几点:

1. 确保目标目录的服务器路径正确,即从PHP脚本位置开始,路径到上传目录是什么。

2. 确保目标目录可写。

关于PHP函数`move_uploaded_file`的一些说明:

move_uploaded_file(
    $_FILES['file']['tmp_name'],
    'uploads/' . $_FILES['file']['name']
);

`$_FILES['file']['name']`是上传时的文件名。你可以用任何你想要的文件名替代它。

最后,还要注意PHP的`upload_max_filesize`和`post_max_size`配置值,确保测试文件的大小不超过这两个限制。

其他注意事项:

- 确保包含了HTML部分和jQuery库。

- `prop('files')[0]`代码用于访问本地文件以便上传到服务器。

- 对于一些旧版本的浏览器,你可能需要使用FormData shiv。

- 确保元素的id为"qdocument"的标签的类型为"file"。

- 如果遇到`.prop('files')[0];`报错`TypeError: 'append' called on an object that does not implement interface FormData.`,请检查FormData是否正确实例化。

- 最后,是否需要使用`event.preventDefault()`取决于具体情况。

以上就是关于为什么在使用Ajax上传文件时无法获取上传文件的原因和解决方法的说明。希望对你有所帮助!

0
0 Comments

为什么我在PHP中使用AJAX无法获取上传的文件?

问题的原因:

1. 未在AJAX请求中正确设置content-type和processData,导致文件无法正确传递。

2. 未在服务器端正确处理文件上传的逻辑。

解决方法:

1. 在AJAX请求中添加contentType:false和processData:false选项,以确保文件能够正确传递。

2. 在服务器端处理文件上传逻辑,包括获取文件名、扩展名、生成新的文件名、移动文件到指定位置,并返回正确的图片标签。

代码如下:

**1. index.php**


  
  
  
  

**2.upload.php**

';
}

现在,您应该能够在PHP中使用AJAX来获取上传的文件了。

0