• SWFUpload多图上传、C#后端跨域传文件带参数


    前几天工作中用到了SWFUpload上传图片,涉及到跨域,因为前端无法实现跨域,所以只能把文件传到后端进行跨域请求,整理分享下。

    效果图

    前端 html部分

    <!DOCTYPE html>
    
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>图片上传</title>
        <style>
            .divContent {
                float: left;
                margin-right: 20px;
            }
            .divDiv {
                border: 1px solid rgb(235, 235, 235);
                width: 150px;
                height: 150px;
            }
            .img {
                width: 150px;
                height: 150px;
            }
            .delImg {
                position: relative;
                top: -150px;
                right: -134px;
                cursor: pointer;
            }
        </style>
    </head>
    <body>
        <div>
            <div>
                <span id="spanButtonPlaceholder"></span><span id="imgNum">当前0张图片</span>
            </div>
        </div>
        <div class="TrDiv" id="imgUrl" style="margin-left:15px;">
    
        </div>
        <script src="~/JS/SWFUpload/swfupload.js"></script>
        <script src="~/JS/SWFUpload/handlers.js"></script>
        <script src="~/JS/Common/jquery-1.7.1.min.js"></script>
        <script src="~/JS/UpLoad/upload.js"></script>
        <script type="text/javascript">
            $(function () {
                upLoad.init();
            });
        </script>
    </body>
    </html>

    前端JS  SWFUpload处理

    
    
    var upLoad = function () {
        var currentNum = 0;
        var totalNum = 0;
    
        var _initEvent = function () {
            initSwfu();
        }
    
        var initSwfu = function () {
            var swfu;
            var file_queue_limit = 20;//队列1,每次只能上传1个,若是1个以上,上传后的样式是叠加图片
            swfu = new SWFUpload({
                upload_url: "/UpLoad/LocalReceive",
                post_params: { "Service": "MyServiceName", "Token": "b2ed46cd1bee4e5d816abdb1ec31b0f8" },
                file_size_limit: "2 MB", //最大2M
                file_types: "*.jpg;*.png;*.gif;*.bmp", //设置选择文件的类型
                file_types_description: "JPG Images", //描述文件类型
                file_upload_limit: "0", //0代表不受上传个数的限制
                file_queue_limit: file_queue_limit,
                file_queue_error_handler: fileQueueError,
                file_dialog_complete_handler: fileDialogComplete, //当关闭选择框后,做触发的事件
                upload_progress_handler: uploadProgress, //处理上传进度
                upload_error_handler: uploadError, //错误处理事件
                upload_success_handler: uploadSuccess, //上传成功够,所处理的时间
                upload_complete_handler: uploadComplete, //上传结束后,处理的事件
                button_image_url: "/JS/SWFUpload/images/XPButtonNoText_160x22.png",
                button_placeholder_id: "spanButtonPlaceholder",
                button_ 160,
                button_height: 22,
                //button_text: '',
                //button_text_style: '.spanButtonPlaceholder { font-family: Helvetica, Arial, sans-serif; font-size: 14pt;} ',
                button_text: '<span class="button">选择图片<span class="buttonSmall">(2 MB Max)</span></span>',
                button_text_style: '.button { font-family: Helvetica, Arial, sans-serif; font-size: 14pt; } .buttonSmall { font-size: 10pt; }',
                button_text_top_padding: 1,
                button_text_left_padding: 5,
                button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
                button_cursor: SWFUpload.CURSOR.HAND,
                flash_url: "/JS/SWFUpload/swfupload.swf",    // Relative to this file
                custom_settings: {
                    upload_target: "divFileProgressContainer"
                },
                debug: false //是否开启日志
            });
        }
        //swfupload插件上传成功回调事件
        function uploadSuccess(file, serverData) {
            var jsonData = eval('(' + serverData + ')');//{"Time":"/Date(1481627678361)/","Code":"100","Message":"成功","Url":"/UpLoadFile/2016/12/13/4E69D7D19EFAFC3F7B927887EA5A2804.jpg"}
            if (jsonData.Code != "100") {
                alert(jsonData.Message);
            } else {
                if (currentNum >= 10) {
                    alert("上传图片不能超过10张");
                    return;
                }
                totalNum++;
                currentNum++;
                $("#imgNum").html("当前" + currentNum + "张图片");
    
                var imgHtml = "";
                imgHtml += "<div class="divContent">";
                imgHtml += " <div class="divDiv">";
                imgHtml += "<img src="" + jsonData.Url + "" class="img" urlData="" + jsonData.Url + ""/>";//url需要改成本地配自己的域名
                imgHtml += "</div>";
                imgHtml += "<img class="delImg" src="/Content/Img/del.png" id="" + totalNum + "">";
                imgHtml += "</div>";
    
                $("#imgUrl").append(imgHtml);
                $("#" + totalNum + "").click(function () {
                    $(this).parent().remove();
                    currentNum--;
                    $("#imgNum").html("当前" + currentNum + "张图片");
                });
            }
    
        }
        //swfupload插件上传失败回调事件
        function uploadError(file, serverData) {
            alert("上传失败");
        }
        return {
            init: function () {
                _initEvent();
            }
        }
    }();
    
    
    
     

    本地后端接收文件和参数,并已二进制格式发送给文件服务器。

     public ActionResult LocalReceive()
            {
                string token = Request["token"];
                string service = Request["service"];
                HttpPostedFileBase file = Request.Files["FileData"];
                string fileName = Path.GetFileName(file.FileName);
    
                string url = HttpContext.Request.Url.Authority;
                string upLoadUrl = "http://" + url + "/ReceiveFile/Index";
                string boundry = "----------------------------------" + DateTime.Now.Ticks.ToString("x");//boundary是分隔符 因为上传文件不在使用原有的http协议了。请求内容不再可能以 x = y方式发送了。而使用了 分隔符 字段内容 分隔符号 字段内容2 而boundary就是指定分隔符号的标志。 
                try
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(upLoadUrl);
                    request.ContentType = "multipart/form-data;boundary=" + boundry;//设置二进制方式传输
                    request.Method = "POST";
                    request.KeepAlive = true;
                    request.Credentials = CredentialCache.DefaultCredentials;//获取或设置请求的身份验证信息。
                    MemoryStream stream = new MemoryStream();
                    byte[] line = Encoding.UTF8.GetBytes("
    --" + boundry + "
    ");
    
                    #region 传文本参数
                    Dictionary<string, string> paramDic = new Dictionary<string, string>();
                    paramDic.Add("Service", service);
                    paramDic.Add("Token", token);//上传注掉
                    string paramTempalte = "
    --" + boundry + "
    Content-Disposition: form-data;name="{0}";
    
    {1}";
                    foreach (var item in paramDic)
                    {
                        string paramStr = string.Format(paramTempalte, item.Key, item.Value);
                        byte[] paramByte = Encoding.UTF8.GetBytes(paramStr);
                        stream.Write(paramByte, 0, paramByte.Length);
                    }
                    stream.Write(line, 0, line.Length);
                    #endregion
    
                    #region 传文件
                    Stream fileReceiveStream = file.InputStream;//测试是否可以合并
                    byte[] fileByte = new byte[fileReceiveStream.Length];
                    fileReceiveStream.Read(fileByte, 0, fileByte.Length);
                    fileReceiveStream.Close();
    
                    string fileHeadTemplate = "Content-Disposition: form-data;name="{0}";filename="{1}"
    Content-Type:application/octet-stream
    
    ";
                    string fileHeadStr = string.Format(fileHeadTemplate, "FileData", fileName);
                    byte[] fileHeadByte = Encoding.UTF8.GetBytes(fileHeadStr);
                    stream.Write(fileHeadByte, 0, fileHeadByte.Length);
                    stream.Write(fileByte, 0, fileByte.Length);
                    stream.Write(line, 0, line.Length);
                    #endregion
    
                    #region 结束上传
                    request.ContentLength = stream.Length;
                    Stream requestStream = request.GetRequestStream();
                    stream.Position = 0L;
                    stream.CopyTo(requestStream);
                    stream.Close();
                    requestStream.Close();
                    #endregion
    
                    #region 获取返回
                    HttpWebResponse responseReceive = request.GetResponse() as HttpWebResponse;
                    Stream streamReceive = responseReceive.GetResponseStream();
                    StreamReader streamReader = new StreamReader(streamReceive, Encoding.UTF8);
                    string content = streamReader.ReadToEnd();
                    #endregion
    
                    JavaScriptSerializer js = new JavaScriptSerializer();
                    UpLoadFileOut upLoadFileOut = js.Deserialize<UpLoadFileOut>(content);
                    return Json(upLoadFileOut);
    
                }
                catch (Exception ex)
                {
    
                    return Json(new { Code = "102", Message = "服务器内部错误", Exception = ex.Message });
                }

    文件服务器接收参数和文件,验证参数并保存文件。

            public ActionResult Index()
            {
                string token = Request["token"];
                string service = Request["service"];
                if (token != "b2ed46cd1bee4e5d816abdb1ec31b0f8" || service != "MyServiceName")
                {
                    return Json(new { Time = DateTime.Now, Code = "101", Message = "参数错误", Url = "" });
                }
                HttpPostedFileBase file = Request.Files["FileData"];
                string fileName = Path.GetFileName(file.FileName);
                string fileExt = Path.GetExtension(fileName);
                string dir = "/UpLoadFile/" + DateTime.Now.Year + "/" + DateTime.Now.Month + "/" + DateTime.Now.Day + "/";
                Directory.CreateDirectory(Path.GetDirectoryName(Request.MapPath(dir)));
    
                string fullDir = dir + GetStreamMD5(file.InputStream) + fileExt;
    
                //文件的MD5值也就是文件名,故根据文件完成路径来判断是否重复上传了,若重复则不需保存。
                if (!System.IO.File.Exists(Request.MapPath(fullDir)))
                {
                    file.SaveAs(Request.MapPath(fullDir));
                }
                return Json(new { Time = DateTime.Now, Code = "100", Message = "成功", Url = fullDir });
    
    
            }
            
            /// <summary>
            /// 计算文件的MD5值
            /// </summary>
            /// <param name="stream"></param>
            /// <returns></returns>
            public static string GetStreamMD5(Stream stream)
            {
                string strResult = "";
                string strHaseData = "";
                byte[] arrbyHashValue;
                System.Security.Cryptography.MD5CryptoServiceProvider oMD5Hasher =
                    new System.Security.Cryptography.MD5CryptoServiceProvider();
                arrbyHashValue = oMD5Hasher.ComputeHash(stream);
                strHaseData = System.BitConverter.ToString(arrbyHashValue);
                strHaseData = strHaseData.Replace("-", "");
                strResult = strHaseData;
                return strResult;
    
            } 

     欢迎批评指正和交流探讨

     DEMO下载地址: http://download.csdn.net/detail/fcydxbd/9710819

    
    
  • 相关阅读:
    Inno Setup打包程序添加hosts解析
    elasticsearch安装教程
    初级模拟电路:10-2 分贝与伯德图
    初级模拟电路:10-1 对数图与分贝
    初级模拟电路:9-4 运放的数据规格书(v2)
    初级模拟电路:9-4 运放的数据规格书
    初级模拟电路:9-3 运放的其他参数
    重新部署Azure虚拟机
    Linux-NFS(网络文件系统)服务开启
    STM32_使用DAC双通道同时输出对齐的三角波和方波
  • 原文地址:https://www.cnblogs.com/zhangchengye/p/6171145.html
Copyright © 2020-2023  润新知