• plupload的一些使用心得


     最近要做一个文件上传的东西 经过同事的推荐所以就选择了plupload,挺强大的 由于项目框架为改动后的MVC 刚一开始破费周折 不过最后总算是完成了 废话不多说了 粘出来代码给大家参考吧!文件包大家去官网上面下载吧。下载地址http://www.plupload.com/

    引用

    <link rel="stylesheet" href="$webpath/library/js/plupload/css/plupload.queue.css"
            type="text/css" media="screen" />
        <script type="text/javascript" src="$webpath/library/js/plupload/jquery.min.js"></script>
        <script type="text/javascript" src="$webpath/library/js/plupload/jquery.plupload.queue.min.js"></script>
        <script type="text/javascript" src="$webpath/library/js/plupload/plupload.min.js"></script>
        <script type="text/javascript" src="$webpath/library/js/plupload/plupload.flash.min.js"></script>

    前台页面的代码JS

    $(function () {
                // 初始化Flash上传插件
                $("#flash_uploader").pluploadQueue({
                    runtimes: 'flash',     //使用Flash插件
                    url: '/AJAX/uploadFiles.ashx',     //服务器端响应页面
                    max_file_size: '10mb', //最大文件限制
                    chunk_size: '1mb',     //一次上传数据大小
                    unique_names: true,     //是否自动生成唯一名称
                    filters: [{ title: "All files", extensions: "doc,docx,ppt,pptx,xls,xlsx,vsd,pot,pps,rtf,wps,et,dps,pdf,txt,epub,rar" }
    ],
                    // 缩放图片
                    resize: { 320, height: 240, quality: 80 },
                    // SWF文件位置
                    flash_swf_url: '$webpath/library/js/plupload/plupload.flash.swf',
                    init: {
                        FileUploaded: function (up, file, info) {
                            //一个文件上传成功
                            var res = $("#hid_FilePath").val();
                            var newres = "";
                            newres = res + info.response;
                            $("#hid_FilePath").val(newres);
                        },
                        Error: function (up, args) {
                            //发生错误
                            if (args.file) {
                                alert('[error] File:' + args.file);
                            } else {
                                alert('[error]' + args);
                            }
                        }
                    }
                });
                // 这一块主要是防止在上传未结束前表单提交,具体大家可酌情修改编写    
                $('form').submit(function (e) {
                    var uploader = $('#uploader').pluploadQueue();  // 取得上传队列   
                    if (uploader.files.length > 0) {  // 就是说如果上传队列中还有文件   
                        uploader.bind('StateChanged', function () {
                            if (uploader.files.length === (uploader.total.uploaded + uploader.total.failed)) {
                                $('form')[0].submit(); //表单提交
                            }
                        });
                        uploader.start();
                    } else {
                        alert('队列中必须至少要有一个文件!');
                    }
                    return false;
                });
            });
        </script>

    我用的是一般处理程序来处理上传的核心代码的uploadFiles.ashx代码

     /// <summary>
            /// Json数据序列化
            /// </summary>
            /// <param name="dic"></param>
            /// <returns></returns>
            private string toJson(Dictionary<string, string> dic)
            {
                return EbookServer_Common.Public.toJson(dic);
            }
            /// <summary>
            /// Json数据反序列化
            /// </summary>
            /// <param name="jsonList"></param>
            /// <returns></returns>
            private string toJsonArray(List<string> jsonList)
            {
                return EbookServer_Common.Public.toJsonArray(jsonList);
            }
            public void UploadFile(HttpContext context)
            {
                Dictionary<string, string> _dic = new Dictionary<string, string>();
                context.Response.CacheControl = "no-cache";
                string s_rpath = FileHelper.GetUploadPath();//@"E:My DocumentsVisual Studio 2008WebSitesSWFUploaddemosapplicationdemo.net";


                string Datedir = DateTime.Now.ToString("yy-MM-dd");
                string updir = s_rpath + "\" + Datedir;
                string returnstr = "";
                int filesize = 0;
                List<string> _arr = new List<string>();
                if (context.Request.Files.Count > 0)
                {
                    try
                    {

                        for (int j = 0; j < context.Request.Files.Count; j++)
                        {
                            Dictionary<string, string> _dic_info = new Dictionary<string, string>();
                            HttpPostedFile uploadFile = context.Request.Files[j];
                            int offset = Convert.ToInt32(context.Request["chunk"]); //当前分块
                            int total = Convert.ToInt32(context.Request["chunks"]);//总的分块数量
                            string name = context.Request["name"];
                            //文件没有分块
                            if (total == 1)
                            {

                                if (uploadFile.ContentLength > 0)
                                {
                                    if (!Directory.Exists(updir))
                                    {
                                        Directory.CreateDirectory(updir);
                                    }
                                    //  string fileId = DateTime.Now.ToString("yyyyMMddHHmmssfff") + uploadFile.FileName.Substring(uploadFile.FileName.LastIndexOf("."));
                                    uploadFile.SaveAs(string.Format("{0}\{1}", updir, name));
                                    filesize = Convert.ToInt32(uploadFile.ContentLength / 1024);
                                }
                            }
                            else
                            {
                                //文件 分成多块上传
                                string fullname = WriteTempFile(uploadFile, offset, name);
                                if (total - offset == 1)
                                {
                                    //如果是最后一个分块文件 ,则把文件从临时文件夹中移到上传文件 夹中
                                    System.IO.FileInfo fi = new System.IO.FileInfo(fullname);
                                    if (!Directory.Exists(updir))
                                    {
                                        Directory.CreateDirectory(updir);
                                    }
                                    string oldFullName = string.Format(@"{0}\{1}", updir, name);
                                    FileInfo oldFi = new FileInfo(oldFullName);
                                    if (oldFi.Exists)
                                    {
                                        //文件名存在则删除旧文件
                                        oldFi.Delete();
                                    }
                                    fi.MoveTo(oldFullName);
                                    filesize = Convert.ToInt32(fi.Length / 1024);
                                }
                            }
                            
                            string filePath = string.Format(@"\upload\{0}\{1}", Datedir, name);
                            string fileName = name;
                            string fileSize = filesize.ToString();
                            returnstr = returnstr + fileName + "||" + filePath + "||" + fileSize + ",";
                        }
                        context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
                        context.Response.Charset = "utf-8";
                        context.Response.AddHeader("content-type", "application/x-javascript");
                        context.Response.Write(returnstr.ToString());
                    }
                    catch (Exception ex)
                    {
                        context.Response.Write("Message" + ex.ToString());
                    }
                }
            }
            /// <summary>
            /// 保存临时文件
            /// </summary>
            /// <param name="uploadFile"></param>
            /// <param name="chunk"></param>
            /// <returns></returns>
            private string WriteTempFile(HttpPostedFile uploadFile, int chunk, string name)
            {
                // string fileId = DateTime.Now.ToString("yyyyMMddHHmmssfff") + uploadFile.FileName.Substring(uploadFile.FileName.LastIndexOf("."));
                string tempDir = FileHelper.GetTempPath();
                if (!Directory.Exists(tempDir))
                {
                    Directory.CreateDirectory(tempDir);
                }
                string fullName = string.Format("{0}\{1}.part", tempDir, name);
                if (chunk == 0)
                {
                    //如果是第一个分块,则直接保存
                    uploadFile.SaveAs(fullName);
                }
                else
                {
                    //如果是其他分块文件 ,则原来的分块文件,读取流,然后文件最后写入相应的字节
                    FileStream fs = new FileStream(fullName, FileMode.Append);
                    if (uploadFile.ContentLength > 0)
                    {
                        int FileLen = uploadFile.ContentLength;
                        byte[] input = new byte[FileLen];

                        // Initialize the stream.
                        System.IO.Stream MyStream = uploadFile.InputStream;

                        // Read the file into the byte array.
                        MyStream.Read(input, 0, FileLen);

                        fs.Write(input, 0, FileLen);
                        fs.Close();
                    }
                }
                return fullName;
            }

    还有一个文件处理类 引用来的FileHelper.cs

        public FileHelper()
            {
                //
                //TODO: 在此处添加构造函数逻辑
                //
            }
            /// <summary>
            /// 获取上传目录
            /// </summary>
            /// <returns></returns>
            public static string GetUploadPath()
            {
                string path = HttpContext.Current.Server.MapPath("~/");
                string dirname = GetDirName();
                string uploadDir = path + "\" + dirname;
                CreateDir(uploadDir);
                return uploadDir;
            }
            /// <summary>
            /// 获取临时目录
            /// </summary>
            /// <returns></returns>
            public static string GetTempPath()
            {
                string path = HttpContext.Current.Server.MapPath("~/");
                string dirname = GetTempDirName();
                string uploadDir = path + "\" + dirname;
                CreateDir(uploadDir);
                return uploadDir;
            }
            private static string GetDirName()
            {
                return System.Configuration.ConfigurationManager.AppSettings["uploaddir"];
            }
            private static string GetTempDirName()
            {
                return System.Configuration.ConfigurationManager.AppSettings["tempdir"];
            }
            public static void CreateDir(string path)
            {
                if (!System.IO.Directory.Exists(path))
                {
                    System.IO.Directory.CreateDirectory(path);
                }
            }

    到此就完成了。。。由于时间紧迫 就不废话了 从中引用了别人的代码 希望能帮到大家 谢谢!

  • 相关阅读:
    JavaScript的函数闭包详细解释
    JavaScript 函数详解
    JavaScript的内置对象(Math对象)
    C#将exe运行程序嵌入到自己的winform窗体中
    C# 获取进程或线程的相关信息
    Easy way to change collation of all database objects in SQL Server
    <?xml version="1.0" encoding="utf-16"?>. use different encoding
    在HTML页面中实现一个简单的Tab
    C# WinForm中将Form显示在Panel中(C#)
    System.InvalidOperationException : 不应有 <Response xmlns=''>。
  • 原文地址:https://www.cnblogs.com/weiying/p/weiying_2014_10_10.html
Copyright © 2020-2023  润新知