为什么我无法通过ajax在我的php中获取上传的文件?
为什么我无法通过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"文件夹也是空的!?
有人可以帮我找出问题吗?
另外下一步应该是用服务器端生成的名称重命名文件。也许有人可以给我一个解决方案。
问题:为什么我在使用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...
通过使用以上的解决方法,可以正确处理文件上传请求并获取上传的文件。
问题:为什么在使用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上传文件时无法获取上传文件的原因和解决方法的说明。希望对你有所帮助!
为什么我在PHP中使用AJAX无法获取上传的文件?
问题的原因:
1. 未在AJAX请求中正确设置content-type和processData,导致文件无法正确传递。
2. 未在服务器端正确处理文件上传的逻辑。
解决方法:
1. 在AJAX请求中添加contentType:false和processData:false选项,以确保文件能够正确传递。
2. 在服务器端处理文件上传逻辑,包括获取文件名、扩展名、生成新的文件名、移动文件到指定位置,并返回正确的图片标签。
代码如下:
**1. index.php**
**2.upload.php**
'; }
现在,您应该能够在PHP中使用AJAX来获取上传的文件了。