使用Ajax异步上传图片的方法(html,javascript,php)

前两天项目中需要用到异步上传图片和显示上传进度的功能,于是找了很多外国的文章,翻山越岭地去遇上各种坑,这里写篇文章记录一下。

HTML

<form id="fileupload-form">    
     <input id="fileupload" type="file" name="file" >   
</form>
HTML代码没什么好说,一个form表单,还有文件类型的input。我们来看js部分。

javascript

//绑定了`submit`事件。    
   $('#fileupload-form').on('submit',(function(e) {
       e.preventDefault();
       //序列化表单   
      var serializeData = $(this).serialize();
      
      // var formData = new FormData(this);
      $(this).ajaxSubmit({
           type:'POST',
           url: *yoururl*,
           dataType: 'json', 
           data: serializeData,            
           // data: formData,
           
           //attention!!!   
           contentType: false,      
           cache: false,             
           processData:false,      
             
           beforeSubmit: function() {
                   //上传图片之前的处理   
           },
           uploadProgress: function (event, position, total, percentComplete){ 
               //在这里控制进度条   
           },
           success:function(){
               
           },
           error:function(data){
               alert('上传图片出错');
           }
       });
   }));

//绑定文件选择事件,一选择了图片,就让`form`提交。   

   $("#fileupload").on("change", function() {
       $(this).parent().submit();
});
PHP

<?php
  //通过$_FILES[]去获取文件
  echo '$_FILES['file']';
遇到的坑:

序列化表单,因为是文件,不能通过val(),text()等方法获取到它的值,只能通过序列化表单提交。代码里面使用.serialize(),有另外一种做法是使用.FormData()来提交,但是实验过程中,一开始正常,后来报错了。在stackoverflow.com上有人看到有人遇到同样地问题,没有解决,于是就放弃了。
普通的ajax是没办法或者说很难拿到上传进度的。这里使用了一个插件jQuery Form Plugin,使用方法很简单,原本ajax的配置都能用,而且有很多实用功能和详尽的使用文档。推荐~
ajax上传图片这三个参数必须配置contentType: false, cache: false, processData:false,。
获取本地预览图,这种方法可能会有浏览器兼容性问题。

$("#fileupload").change(function(){
  if (this.files && this.files[0]) {
       var reader = new FileReader();            
       reader.onload = function (e) {
             $('#theImg').attr('src', e.target.result);
    }
       reader.readAsDataURL(this.files[0]);
   }
}
php部分注意虽然Ajax那里使用的是POST方法,但是后台接受的时候只要是文件都是用$_FILES。你可以通过$_FILES['file']['type']去判断文件格式来做安全处理,我们这里只是演示。还有其他参数,比如tmp_name是文件路径,name是文件名。后台接收以后,你可以使用move_uploaded_file()来将文件保存到服务器上。这里就不多说。

如果提示: $(...).ajaxSubmit is not a function

 

页面js出现TypeError: $(...).ajaxSubmit is not a function 错误。

解决办法是:将jQuery-form.js文件引入页面即可。

jquery-form.js 下载地址:链接: http://pan.baidu.com/s/1ntHqJKP 密码: geb2

转载于:https://www.cnblogs.com/hgj123/p/6372712.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你可以参考以下的代码实现: HTML代码: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>注册账号</title> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> </head> <body> <h1>注册账号</h1> <form id="register-form"> <label for="username">用户名:</label> <input type="text" id="username" name="username"><br> <label for="password">密码:</label> <input type="password" id="password" name="password"><br> <label for="email">邮箱:</label> <input type="text" id="email" name="email"><br> <button type="submit">注册</button> </form> <div id="result"></div> <script src="register.js"></script> </body> </html> ``` JavaScript代码: ```javascript $(function() { // 监听表单提交事件 $('#register-form').submit(function(event) { // 阻止默认表单提交事件 event.preventDefault(); // 获取表单数据 var formData = { 'username': $('input[name=username]').val(), 'password': $('input[name=password]').val(), 'email': $('input[name=email]').val() }; // 发送异步请求 $.ajax({ type: 'POST', url: 'register.php', dataType: 'json', data: formData, encode: true }) .done(function(data) { // 注册成功 $('#result').html('<p>' + data.message + '</p>'); // 清空表单 $('#register-form')[0].reset(); }) .fail(function(data) { // 注册失败 $('#result').html('<p>' + data.responseJSON.message + '</p>'); }); }); }); ``` PHP代码: ```php <?php // 模拟注册逻辑 if ($_SERVER['REQUEST_METHOD'] == 'POST') { $username = $_POST['username']; $password = $_POST['password']; $email = $_POST['email']; // 判断用户名是否已存在 if ($username == 'admin') { http_response_code(400); echo json_encode(array('message' => '用户名已存在')); } else { // 注册成功 echo json_encode(array('message' => '注册成功')); } } ``` 在这个例子中,我们使用了 jQuery 库来简化异步请求的代码。当用户在前端页面填写完注册信息后,点击注册按钮,前端代码会将表单数据通过 Ajax 异步请求发送到后端 PHP 脚本,PHP 脚本模拟了注册逻辑,如果注册成功,会返回一个 JSON 数据,前端代码会根据返回的数据提示用户注册成功,同时清空表单;如果失败,会返回一个错误消息,前端代码会根据错误消息提示用户注册失败。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值