dropzone.js使用总结

1、前言

最近做一个项目,需要用到多文件的上传。其实使用普通的file也可以实现,未免就是样式太难看了。于是在网上搜索拥有此功能的上传插件,发现jquery.fileupload.js和dropzone.js是不同的选择,相比之下,个人觉得drop.js使用起来更为简单一点,于是这篇文章将记录自己的一点心得,备以后查看,也为需要的朋友提供一个参考。

2、配置

dropzone有两种方式实现文件的上传,一种使用form,另一种就是div,由于我的文件上传区在一个form表单中,所以使用第一种form的话,form中套form就会引起错误,所以我使用了第二种div的方式,本文也会主要介绍这种方式。

咱们都知道,使用一个插件之前,得引入它的样式和js文件。所以首先咱得先引入相关文件,如下:

<link rel="stylesheet" type="text/css" href="dropzone.css" />  
<script type="text/javascript" src="dropzone.js"></script>  
Dropzone 是不依赖 jQuery 框架的,所以对于dropzone的初始化操作都分为jquery和非jquery两种,相信当家都习惯用jquery了吧,那咱们就以jquery版本来说,那么您就需要引入jquery了,如果是在需要非jquery操作,那么这里有一个参考的api,挺不错的 。dropzone.js中文文档

A、form方式

<form action="/file-upload" class="dropzone">
  <div class="fallback">
    <input name="file" type="file" multiple />
  </div>
</form>
这种方式比较简单,Dropzone将查找所有的 class 属性中包含 dropzone 的表单元素,的表单元素,自动地把自己加入到表单元素上,并且拖拽进的这些上传文件将被发送到 action 这个特殊的参数。所以在此action是不能缺少的,要不文件就不知道提交到哪进行处理了。 这些上传文件将被正常处理像下面这样的HTML代码:
<input type="file" name="file" />
B、div方式

<div id="myDropzone" class="dropzone" style="">
 </div>
对,需要的代码就这么点。下面进行dropzone的初始化。

在这次的项目中,是在点击后提交文件,不是选中后上传,选中上传更简单点额。如下初始化代码

//div做上传区域时使用的配置
    Dropzone.autoDiscover = false;// 禁止对所有元素的自动查找,由于Dropzone会自动查找class为dropzone的元素,自动查找后再在这里进行初始化,有时候(并不是都这样)会导致重复初始化的错误,所以在此加上这段代码避免这样的错误。
    $("#myDropzone").dropzone(
 //项目使用.net,所以此处的action就这样了。该参数必须指定。
  url: '@Url.Action("fileupload", "FileUpload")' + "/" + para,
 //改变文件框中的文字提示
  dictDefaultMessage: '<span class="bigger-150 bolder"><i class="icon-caret-right red"></i> 拖动文件至该处</span><span class="smaller-80 grey">(或点击此处)</span> <br /><i class="upload-icon icon-cloud-upload blue icon-3x"></i>',
 //方式指定
        method: 'post',
        filesizeBase: 102400000,//这个选项将设置在计算文件大小时使用 1000 还是使用 1024作为基本单位
        //dropzone同时上传的文件不能超过6个,所以parallelUploads的设置就不能大于6,大于6后就会出现“超过最大长度”   //错误,导致上传失败
        parallelUploads: 5,//有多少文件将上载到并行处理,默认2(一次最多上传不能超过6个,小于等于6个的传完后,再上传  //第二批的文件)
        maxFilesize: 3072,//以MB为单位[上传文件的大小限制]
        autoProcessQueue: false,//关闭自动上传功能,默认会true会自动上传,也就是添加一张图片向服务器发送一次请求
        addRemoveLinks:true,//在每个预览文件下面添加一个remove[删除]或者cancel[取消](如果文件已经上传)上传文件的链  接
        uploadMultiple: true,//允许上传多文件
        dictCancelUpload: '取消',
        dictRemoveFile: '删除',
        dictFallbackMessage: '不好意思,您的浏览器不支持!',//如果浏览器不支持,默认消息将被替换为这个文本。默认为 “Your browser does not support drag'n'drop file uploads.”。
        dictInvalidFileType: '该文件不允许上传',//如果文件类型不匹配时显示的错误消息。
        dictResponseError:'上传失败,请稍后重试',//如果服务器响应是无效的时候显示的错误消息。 {{statusCode}} ` 将被  替换为服务器端返回的状态码。
  //函数绑定
   init: function () {
            var submitButton = $("#saveForm")
            myDropzone = this; // closure

            //为上传按钮添加点击事件
            submitButton.on("click", function () {
                //此处可以动态设置url,为了向文件上传的后台提供项目对应的id
                myDropzone.options.url = '@Url.Action("fileupload", "FileUpload")' + "/" +para;
                //手动上传所有图片
     //saveQuestion是我的一个保存表单其他数据的方法,保存成功后,返回true 
       if (saveQuestion()) {
                    //判断上传的文件不为空时,(保证没有选择文件的时候不进行上传操作)
                    if (myDropzone.getAcceptedFiles().length != 0) {
        //如果你设置了选项 autoProcessQueue 为 true, 然后队列就会被立即处理, 在
       //文件拖放到zone或者上传完成后, 调用.processQueue() 来检查当前有多少文件
       //正在被上传,如果它的值小于options.parallelUploads的设置值时,就会调用
       //.processFile(file)上传文件
      // 如果你设置 autoProcessQueue为false, 那么 .processQueue() 方法是不会
       //被隐式调用的. 这意味着你必须在你想要上传队列中的所有文件时,自己去调用这
       //个方法(引用自:
       //http://wxb.github.io/dropzonejs.com.zh-CN/dropzonezh-CN/#installation)

    //手动指定  
        myDropzone.processQueue();
                    }
                    else
                    {
                        //操作
                    }
                }
            });
            //当添加图片后的事件
            //this.on("addedfile", function (file) {
             // 代码
            //});
            //当上传完成后的事件,接受的数据为JSON格式
            //如果是单文件的上传,该文件上传完成之后返回关于此文件的一些信息
            //多文件同时上传的时候,只返回的是最后上传的那个文件的信息
            this.on("complete", function (data) {
                //代码
            });
            //删除图片的事件,file包含文件的一些信息
            this.on("removedfile", function (file) {
      //这是点击删除按钮(remove file)的删除事件,但是这里的删除只是将文件从这个显示区移除而已,
       //并没有删除文件,如果想自己删除存储了的文件或者其他的操作,请重新编写。 例如:

   //上传成功后的删除,点击删除同时删除本地图片与数据库数据           
                var xhr = JSON.parse(file.xhr.response);
                var filenewname = "";
                for (var i = 0; i < xhr.fileinfolist.length; i++) {
                 if (xhr.fileinfolist[i].fileName == file.name) {
                            filenewname = xhr.fileinfolist[i].fileNewName;
                        }
                    }
                var filepath = xhr.fileRoot + "\\" + filenewname;
      //以上获取上传成功后的路径,然后在你自己的删除事件中进行处理 
     delFile(filepath);
            });
            //上传成功后的事件
            //每上传成功一个文件,返回一对关于此文件的file和res,多文件一起上传时将返回几对这样的数    据
            //这里的res就是后台处理文件的方法返回的json数据。至于返回怎样的json数据,完全是由自己自  定义的
            this.on("success", function (file, res) {
                //代码
            });
        }
    }

.net MVC后台文件上传代码:

public ActionResult fileupload()
        {
            bool isSavedSuccessfully = true;
            int count = 0;
            string msg = "";

            string fileName = "";
            string fileExtension = "";
            string filePath = "";
            string fileNewName = "";
            string fileRoot = "";
            List<fileupload> fileinfolist = new List<fileupload>();

            //项目的ID(就是刚才action后面的参数)
            int projectId = Convert.ToInt32(RouteData.Values["id"]);

            try
            {
    //指定你的文件上传位置 
       string directoryPath = Server.MapPath("~/File/file");
    //如果路径不存在将创建 
       if (!Directory.Exists(directoryPath))
                    Directory.CreateDirectory(directoryPath);
    //多文件上传循环取出数据 
                foreach (string f in Request.Files)
                {
                    HttpPostedFileBase file = Request.Files[f];

                    if (file != null && file.ContentLength > 0)
                    {
                        fileName = file.FileName;
                        fileExtension = Path.GetExtension(fileName);
                        fileNewName = Guid.NewGuid().ToString() + fileExtension;
                        fileRoot = Path.Combine(directoryPath);
                        filePath = Path.Combine(directoryPath, fileNewName);
       //保存文件
           file.SaveAs(filePath);
                        string tmpRootDir = Server.MapPath(System.Web.HttpContext.Current.Request.ApplicationPath.ToString());//获取程序根目录
                        string RelativePath = filePath.Replace(tmpRootDir, ""); //转换成相对路径(数据库中存储的路径)
                        RelativePath = "/" + RelativePath.Replace(@"\", @"/");
        //更多的文件操作
        ........
        count++;
                    }
                }
                saveFile(fileinfolist);
            }
            catch (Exception ex)
            {
                msg = ex.Message;
                isSavedSuccessfully = false;
                //程序出错,删除文件
                foreach (var item in fileinfolist)
                {
                    string tmpRootDir = Server.MapPath(System.Web.HttpContext.Current.Request.ApplicationPath.ToString());
                    string filepath = tmpRootDir.Substring(0, tmpRootDir.Length - 1) + item.filePath.Replace(@"/", @"\");
                    System.IO.File.Delete(filepath);
                }
            }
   //这里返回的json就是事件绑定success中的res参数。  
        return Json(new
            {
                Result = isSavedSuccessfully,
                Count = count,
                Message = msg,
                fileinfolist = fileinfolist,
                fileRoot = fileRoot
            });
        }

以上基本就是使用dropzone上传文件的一些总结了,不清楚查看文档 dropzone中文文档,下面顺便将.net mvc文件的下载等常用操作记录下:

3、文件删除、文件下载 记录

删除本地的文件(用来dropzone上传成功后的删除额,即romovedfile中的文件上传后的删除可以用到),如下,c此处的filepath是数据库中的相对路径,也就是上面程序处理后的RelativePath,如果此处已经是绝对路径,就不用这么处理了,直接最后一行代码删除就ok了。

string tmpRootDir = Server.MapPath(System.Web.HttpContext.Current.Request.ApplicationPath.ToString());
string filepath = tmpRootDir.Substring(0, tmpRootDir.Length - 1) + FilePath.Replace(@"/", @"\");
System.IO.File.Delete(filepath);
文件下载:

 后台:

int id = Convert.ToInt32(RouteData.Values["id"]);
var solution = getSolutionByid(id);//该方法通过id获取文件存储在数据库中的信息
string filePath = solution.FilePath;//相对路径
var fullpathname = Server.MapPath(filePath);//转换为文件的绝对路径
return File(new FileStream(fullpathname, FileMode.Open), "application/octet-stream",  Server.UrlEncode(solution.FileName));

 前台:

window.open('@Url.Action("downloadSolutionAttachment", "SWmaintenance")' + "/" + id);











评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值