jquery2000 阅读(98153) 评论(14)

 

我想通过jQuery异步上传文件,这是我的HTML:

 

<span>File</span>
<input type="file" id="file" name="file" size="10"/>
<input id="uploadbutton" type="button" value="Upload"/>

这是我的javascript:

 

$(document).ready(function () {
  $("#uploadbutton").click(function () {
    var filename = $("#file").val();

    $.ajax({
      type: "POST",
      url: "addFile.do",
      enctype: 'multipart/form-data',
      data: {
        file: filename
      },
      success: function () {
        alert("Data Uploaded: ");
      }
    });
  });
});

我只得到上传的文件名,咋办?

 

我现在用了 jQuery Form插件来解决这个问题:http://malsup.com/jquery/form/#code-samples

有没有不用该插件来实现呢?

 

解决方法:

可以采用HTML5,用jQuery,Ajax实现文件上传,不仅如此,你可以做文件验证(名称,大小,MIME类型)或利用HTML5的进度标签(或者div)处理进度事件。

 

最近我也在做文件上传,我不想用flash、iframe或其它插件,经过一番研究,我想出了解决方案。

HTML:

 

<form enctype="multipart/form-data">
<input name="file" type="file" />
<input type="button" value="Upload" />
</form>
<progress></progress>

首先,你可以做一些验证,例如文件的onChange事件:

 

$(':file').change(function(){
    var file = this.files[0];
    name = file.name;
    size = file.size;
    type = file.type;
    //your validation
});

按钮点击触发Ajax:

 

$(':button').click(function(){
    var formData = new FormData($('form')[0]);
    $.ajax({
        url: 'upload.php',  //server script to process data
        type: 'POST',
        xhr: function() {  // custom xhr
            myXhr = $.ajaxSettings.xhr();
            if(myXhr.upload){ // check if upload property exists
                myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // for handling the progress of the upload
            }
            return myXhr;
        },
        //Ajax事件
        beforeSend: beforeSendHandler,
        success: completeHandler,
        error: errorHandler,
        // Form数据
        data: formData,
        //Options to tell JQuery not to process data or worry about content-type
        cache: false,
        contentType: false,
        processData: false
    });
});

处理进度:

 

function progressHandlingFunction(e){
    if(e.lengthComputable){
        $('progress').attr({value:e.loaded,max:e.total});
    }
}

 

 

HTML5的文件上传非常简单,但必须在支持HTML5的浏览器中运行。

 


评论列表
wuchangliang
var formData = new FormData($('form')[0]);
请问,在ie上有没有好的方法代替呢?
s
ewe
3268013878@qq.co
请问为什么我进入了error区间,输出TypeError:Cannot read property 'open' of underfined
3268013878@qq.co
请问为什么我进入了error区间,输出TypeError:Cannot read property 'open' of underfined
12
fgsdf
大向
我想用异步请求实现与数据库的交换,但是用不好,每次都是死循环。请高人指点!
大向
我有个建议,不知道好不好。左边的文字颜色容易使人看不太清楚,易花眼。建议换成深颜色的。
momo
The current request is not a multipart request 为什么报这个错呢
仍然有
热有人要
你好
可以上传视频和png格式的图片吗
你好
可以上传视频和png格式的图片吗,急等着用。谢谢!
只能帮到你这里了
var filename = $("#file").val(); 这个写法本来就得不到文件吧
文件是$("#file").prop("files")[0]
aa
  beforeSend: beforeSendHandler,
            success: completeHandler,
            error: errorHandler,

未定义。怎么改呢
bjiang
我最常用的方法是,让form submit到页面中的一个隐藏的iframe中,然后通过页面间通讯的方式来告知原来的主页面已经上传完成.但这个解决不了进度条的问题.

发表评论
切换编辑模式