plupload.Uploader多文件上传

Posted 听哥哥的话

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了plupload.Uploader多文件上传相关的知识,希望对你有一定的参考价值。

1.前台CommonUpfile.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CommonUpfile.aspx.cs" Inherits="HraWeb.ETL.CommonUpfile" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <title></title>
 <script type="text/javascript" src="/Scripts/plupload/js/plupload.full.min.js"></script>
   <style>
       #container{
           margin-left:100px;
       }
       button{
          width: 100px;
           height: 50px; 
           background-color: cornflowerblue;
       }
   </style>
</head>

<body style="font: 13px Verdana; background: #eee; color: #333">

<h1 style="margin-left:50px;">请选择要导入的文件</h1>

<p></p>

<div id="filelist"></div>
<br />

<div id="container">
    <button id="pickfiles" >浏览</button> &nbsp;&nbsp;&nbsp;
    <button id="uploadfiles" >上传的文件</button>
</div>

<br />
<pre id="console"></pre>


<script type="text/javascript">
    // Custom example logic
var uploader = new plupload.Uploader({
    runtimes: html5,flash,silverlight,html4,
    unique_names:true,
    multipart: true,
    multi_selection:true,
    chunk_size: 10mb,
    browse_button : pickfiles, // you can pass an id...
    container: document.getElementById(container), // ... or DOM Element itself
    url: /ETL/CommonUpfile.aspx?_method=upload&callBack=<%=Request["callBack"]%>,
    flash_swf_url: /Scripts/plupload/js/Moxie.swf,
    silverlight_xap_url: /Scripts/plupload/js/Moxie.xap,
    
    filters : {
        max_file_size : 1000mb
        //,mime_types: [
        //    {title : "Image files", extensions : "jpg,gif,png"},
        //    {title : "Zip files", extensions : "zip"}
        //]
    },

    init: {
        PostInit: function() {
            document.getElementById(filelist).innerHTML = ‘‘;

            document.getElementById(uploadfiles).onclick = function() {
                uploader.start();
                return false;
            };
        },

        FilesAdded: function(up, files) {
            plupload.each(files, function(file) {
                document.getElementById(filelist).innerHTML += <div id=" + file.id + "> + file.name +  ( + plupload.formatSize(file.size) + ) <b></b></div>;
            });
        },

        UploadProgress: function (up, file) {
           
            document.getElementById(file.id).getElementsByTagName(b)[0].innerHTML = <span> + file.percent + "%</span>";
        },

        Error: function (up, err) {
          
            document.getElementById(console).appendChild(document.createTextNode("\nError #" + err.code + ": " + err.message));
        },
        FileUploaded: function (up, file, res) {
           
           
            //res = JSON.parse(res.response);
            //art.dialog.close()
           
            //artDialog.open.origin.uploadCallBack(file.id,file.name);
           
        }
        , UploadComplete(up,files) {
            alert("full");
            var fileArr = new Array();
            for (var i = 0; i < files.length; i++) {
                var f = new Object();
                f.id = files[i].id;
                f.name = files[i].name;
                fileArr.push(f);
                alert(files[i].name+"...")
            }
            var fileObj = JSON.stringify(fileArr);
            $.post("CommonUpfile.aspx?_method=NewImportFile", { fileObj: fileObj }, function (data) {
                data = JSON.parse(data);
                $.messager.alert("导入完成",data.Message);
                artDialog.open.origin.dicCallback();
                art.dialog.close();
            });
        }
    }
});

uploader.init();
$("#console").hide();
</script>
   <form id="form1" runat="server">

    </form>
</body>

</html>

2.后台 CommonUpfile.aspx.cs
using Contract.Domain;
using Contract.IService;
using Holworth.BatchingHosting.Interface;
using Holworth.Utility;
using SocketIM;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.ServiceModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace HraWeb.ETL
{
    public partial class CommonUpfile : Common.BasePage
    {
        private Contract.IService.IDaoService _dao; Contract.IService.IDaoService Dao { get { if (_dao == null) { _dao = ctx.GetObject("DaoService") as Contract.IService.IDaoService; } return _dao; } }
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request["_method"] == "upload")
            {
                btn_UppLoad();
            }
            else if (Request["_method"] == "NewImportFile")
            {
                string fileObj = Request["fileObj"];
                var dic = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(fileObj);
                Dictionary<string, string> idnames = new Dictionary<string, string>();
                foreach (var item in dic)
                {
                    var id = item.id.ToString().Replace("{", "").Replace("}", "");
                    var name = item.name.ToString().Replace("{", "").Replace("}", "");
                    idnames[id] = name.ToLower();

                }
                int i = 0;
                try
                {

                    string root = Server.MapPath("~/upload");
                    var mapList = Dao.FindList<EtlDataMap>(new Framework.QueryInfo() { CustomSQL = "select a from EtlDataMap a" });
                  
                    var mapDict = mapList.ToDictionary(x => x.FileNameStart.ToLower());
                    string fileName = "";
                    foreach (var item in idnames)
                    {
                        string ext = Path.GetExtension(item.Value);
                        string fileId = item.Key;
                        fileName = Path.Combine(root, fileId + ext);

                        try
                        {
                            SendFile(fileName, item.Value, mapDict[item.Value.Split(.)[0]].Id);
                            HttpMessages.Instance().PushMessage("导入" + item.Value+"成功");
                        }
                        catch (Exception ex)
                        {
                            HttpMessages.Instance().PushMessage("导入" + item.Value + "失败,因为:"+ex.Message);
                            Holworth.Utility.Logger.Fatal(ex);
                           
                        }
                        
                    }
                    
                    var message = new { Message = "导入成功,未导入的文件请查看文件是否在ETL中有定义!!!" };
                    Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(message));




                }
                catch (Exception ex)
                {
                    var message = new { ErrorCode = "-1", Message = "导入失败,因为" + ex.Message };
                    Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(message));
                    Holworth.Utility.Logger.Fatal(ex); ;
                }
                finally
                {
                    Response.End();
                }

            }

        }
        public void SendFile(string fileName, string fileNameStart, string mapId)
        {

            string ipaddr = Holworth.Utility.HraUtility.ConfigurationManager.GetConfig("heartbeatservice", "/Config/ETL.config", HraUtility.IgnoreCase.Ignore);
            IHeartBeat channel = InvokeContext.CreateWCFServiceByURL<IHeartBeat>(ipaddr, "ws2007HttpBinding", null);
            ICommunicationObject communicationObject =
(ICommunicationObject)channel;
            try
            {
                channel.ClearOldFiles();
                int maxBufferLength = 10 * 1024 * 1024;
                FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                long fileLen = fs.Length;                        // 文件长度
                long totalLen = fileLen;                            // 未读取部分
                int readLen = 0;                                // 已读取部分
                byte[] buffer = null;

                if (fileLen <= maxBufferLength)
                {            /* 文件可以一次读取*/
                    buffer = new byte[fileLen];
                    readLen = fs.Read(buffer, 0, (int)fileLen);
                    channel.Transfer(fileNameStart, buffer);
                }
                else
                {
                    /* 循环读取文件,并发送 */
                    while (totalLen != 0)
                    {

                        if (totalLen < maxBufferLength)
                        {
                            buffer = new byte[totalLen];
                            readLen = fs.Read(buffer, 0, Convert.ToInt32(totalLen));
                        }
                        else
                        {
                            buffer = new byte[maxBufferLength];
                            readLen = fs.Read(buffer, 0, maxBufferLength);
                        }
                        channel.Transfer(fileNameStart, buffer);
                        totalLen -= readLen;
                    }
                }
                fs.Flush();
                fs.Close();
                Dictionary<string, string> dic = new Dictionary<string, string>();
                dic["DataMap"] = string.Join(",", mapId.Split(,));
                dic["FormId"] = Guid.NewGuid().ToString();
                var s = Newtonsoft.Json.JsonConvert.SerializeObject(dic);
                channel.LoadEodFile(s, Guid.NewGuid().ToString());
                communicationObject.Close();
            }
            catch (Exception ex)
            {
                communicationObject.Abort();
                Holworth.Utility.Logger.Fatal(ex);
                throw;
            }
            finally
            {
                try
                {
                    File.Delete(fileName);
                }
                catch (Exception exx)
                {
                    Holworth.Utility.Logger.Fatal(exx);
                }
            }
        }
        protected void btn_UppLoad()
        {
            int statuscode = 1;
            string message = string.Empty;
            string filepath = string.Empty;
            string root = Server.MapPath("~/upload");
            List<string> oldFiles = Net.GetFiles(root);
            //foreach (var item in oldFiles)
            //{
            //    if (File.Exists(item))
            //    {
            //        File.Delete(item);
            //    }
            //}
            //            string ipaddr = Holworth.Utility.HraUtility.ConfigurationManager.GetConfig("heartbeatservice", "/Config/ETL.config", HraUtility.IgnoreCase.Ignore);
            //            IHeartBeat channel = InvokeContext.CreateWCFServiceByURL<IHeartBeat>(ipaddr, "ws2007HttpBinding", null);
            //            ICommunicationObject communicationObject =
            //(ICommunicationObject)channel;
            try
            {
                //channel.InitDataNoInit();
                //communicationObject.Close();
                if (Request.Files != null && Request.Files.Count > 0)
                {
                    if (Request.Files.Count > 0)
                    {
                        try
                        {
                            string resourceDirectoryName = "upload";
                            string path = Server.MapPath("~/" + resourceDirectoryName);
                            if (!Directory.Exists(path))
                                Directory.CreateDirectory(path);

                            int chunk = Request.Params["chunk"] != null ? int.Parse(Request.Params["chunk"]) : 0; //获取当前的块ID,如果不是分块上传的。chunk则为0
                            string fileName = Request.Params["name"]; //这里写的比较潦草。判断文件名是否为空。
                                                                      //if (!fileName.Contains("qwert"))
                                                                      //{

                            //    fileName = $"{Path.GetFileName(fileName).Split(‘.‘)[0]}qwert.dat";
                            //}
                            string type = Request.Params["type"]; //在前面JS中不是定义了自定义参数multipart_params的值么。其中有个值是type:"misoft",此处就可以获取到这个值了。获取到的type="misoft";

                            string ext = Path.GetExtension(fileName);
                            //fileName = string.Format("{0}{1}", Guid.NewGuid().ToString(), ext);
                            filepath = resourceDirectoryName + "/" + fileName;
                            fileName = Path.Combine(path, fileName);

                            //对文件流进行存储 需要注意的是 files目录必须存在(此处可以做个判断) 根据上面的chunk来判断是块上传还是普通上传 上传方式不一样 ,导致的保存方式也会不一样
                            FileStream fs = new FileStream(fileName, chunk == 0 ? FileMode.OpenOrCreate : FileMode.Append);
                            //write our input stream to a buffer
                            Byte[] buffer = null;
                            if (Request.ContentType == "application/octet-stream" && Request.ContentLength > 0)
                            {
                                buffer = new Byte[Request.InputStream.Length];
                                Request.InputStream.Read(buffer, 0, buffer.Length);
                            }
                            else if (Request.ContentType.Contains("multipart/form-data") && Request.Files.Count > 0 && Request.Files[0].ContentLength > 0)
                            {
                                buffer = new Byte[Request.Files[0].InputStream.Length];
                                Request.Files[0].InputStream.Read(buffer, 0, buffer.Length);
                            }

                            //write the buffer to a file.
                            if (buffer != null)
                                fs.Write(buffer, 0, buffer.Length);
                            fs.Close();

                            statuscode = 1;
                            message = "上传成功";

                        }
                        catch (Exception ex)
                        {
                            statuscode = -1001;
                            message = "保存时发生错误,请确保文件有效且格式正确";

                            Holworth.Utility.Logger.Fatal(ex.Message);
                        }
                    }
                    else
                    {
                        statuscode = -404;
                        message = "上传失败,未接收到资源文件";
                    }

                    string msg = "{\"statusCode\":\"" + statuscode + "\",\"message\":\"" + message + "\",\"filePath\":\"" + filepath + "\"}";
                    //Response.Write(msg);


                }
            }
            catch (Exception ex)
            {

                Holworth.Utility.Logger.Fatal(ex);
                // communicationObject.Abort();
            }
            finally
            {
                //Response.End();
            }

        }
        IEtlExcelService svc
        {
            get
            {
                return (IEtlExcelService)ctx.GetObject("EtlExcelService");
            }
        }

    }
}

 

以上是关于plupload.Uploader多文件上传的主要内容,如果未能解决你的问题,请参考以下文章

批量上传

PHP仿微信多图片预览上传功能

在本地预览可以,上传到服务器上怎么就一片空白?

php多文件上传实现代码

plupload 大文件分片上传与PHP分片合并探索

springboot报错说 Failed to parse multipart servlet request; nested exception is java.io.IOException(代码片