• html5上传图片(一)一跨域上传


           最近开发一个上传图片的模块,传图片的接口不支持跨域上传,并且只支持单张上传,而我们的产品要求要实现多张上传。我搞了一个代理页面,先将图片传到代理页面,然后再通过代理页面传到上传图片接口。虽然这种方式经过一个代理页面会增加消耗的时间,但总算解决了跨域上传的问题。现在粘贴我的代码如下,前端脚本:

      1 (function () {
      2     var imgOperate = {
      3         operateUrl: "更改图片在数据库中的状态地址",
      4         uploadUrl: "代理图片上传地址",
      5         DelPicId: '',
      6         ddWidth: 0,
      7         dlWidth:0,
      8         onload: function () {
      9             this.initImage();
     10         },
     11         initImage: function () {
     12             var et = $('#entrust dd').length;
     13             this.ddWidth = $('#entrust dd').width() + 17;
     14             this.dlWidth = parseInt(et * this.ddWidth + 160);
     15             $('#entrust').css("width", this.dlWidth);
     16             this.BindEvent();
     17         },
     18         BindEvent: function () {
     19             var _this = this;
     20             $("#pic0").on("change", function () {
     21                
     22                 _this.uploadFiles(this);
     23               
     24             });
     25     
     26         },
     27         InserImage:function(urls,dd)
     28         {
     29             $.post(this.operateUrl, { houseid: houseid, operateType: 1, picStr: urls }, function (data) {
     30                 data = eval("(" + data + ")");
     31                 if (data && data.picIds)
     32                 {
     33                     dd.getElementsByTagName("img")[0].setAttribute("housepicid", data.picIds);
     34                 }
     35             });
     36         },
     37         uploadFiles: function (where) {
     38            
     39             var imgLength = $("#entrust dd").length - 1;
     40             
     41             if (imgLength >= 50)
     42             {
     43                 this.ShowMsg("你的图片超过了50张,不能再上传");
     44                 return;
     45             }
     46             if (imgLength + where.files.length > 50)
     47             {
     48                 this.ShowMsg("你选择的图片超过了50张,无法上传,请重新选择");
     49                 return;
     50             }
     51             var _this = this;
     52             var radtime = new Date();
     53             var _this = this;
     54             var sid = radtime.getTime();
     55             for (var i = 0, successCount=0; i < where.files.length; i++) {
     56                 var formData = new FormData();
     57                
     58                 formData.append("icoimage",where.files[i]);
     59             
     60                 $.ajax({
     61                     url:this.uploadUrl+ '?channel=频道&sid=' + sid,
     62                     type: 'POST',
     63                     cache: false,
     64                     data: formData,
     65                     processData: false,
     66                     contentType: false
     67                 }).success(function (res) {
     68                     var imgsrc = res;
     69                if (imgsrc == "-1" || imgsrc == "302" || imgsrc == -1 || imgsrc == 302) {
     70                                  _this.ShowMsg("上传失败,照片超过10M");
     71                              } else if (imgsrc.indexOf("http")!=-1) {
     72                                      var dd = document.createElement("dd");
     73                                      if ($("#entrust dd").length == 1) {
     74                                          dd.innerHTML = "<div class="cver">封面图</div><a class="close"></a><img src="" + imgsrc + "" housepicid="">";
     75                                      } else {
     76                                          dd.innerHTML = "<a class="close"></a><img src="" + imgsrc + "" housepicid="">";
     77                                      }
     78                                      document.getElementById("entrust").appendChild(dd);
     79                                      _this.dlWidth += _this.ddWidth + 17;
     80                                      $('#entrust').css("width", _this.dlWidth);
     81                                      _this.InserImage(imgsrc, dd);
     82                                      successCount++;
     83                                      _this.ShowMsg("正在上传第" + i + "张图片");
     84                                        }
     85                if (i == where.files.length) {
     86                    if (successCount > 0) {
     87                        _this.ShowMsg("成功上传" + successCount + ",可继续上传新照片");
     88                    }
     89                } else {
     90                    _this.ShowMsg("上传失败");
     91                }
     92 
     93                 })
     94             }
     95 
     96         },
     97         ShowMsg: function (text, mymethod) {
     98             var radtime = new Date();
     99             var sid = radtime.getTime();
    100             var msg_div = "<div class='zuopenbox' id='div_msg" + sid + "'><div class='opencon_01'><div class='openList'><h3 class='f15' style='margin-bottom: 0; color: #FFFFFF'>" + text + "</h3></div></div></div>";
    101 
    102             $(msg_div).appendTo("body");
    103             var _this = this;
    104             setTimeout(function () {
    105                 var d = 0.5;
    106                 var m = document.getElementById("div_msg"+sid);
    107                 m.style.webkitTransition = '-webkit-transform ' + d + 's ease-in, opacity ' + d + 's ease-in';
    108                 m.style.opacity = '0';
    109                 setTimeout(_this.RemoveNode(m), 500);
    110             }, 500);
    111         },
    112         RemoveNode: function (m) {
    113             m.parentNode.removeChild(m);
    114         }
    115 
    116     }
    117 
    118     imgOperate.onload();
    119     window.imgOperate = imgOperate;
    120    
    121 
    122 
    123 })();
    前端脚本代码

    代理服务器代码:

         public override void ProcessRequest(HttpContext context)
            {
                //获取目标站点地址
                String target = "图片服务器地址";
                string sid = context.Request["sid"];
                target = string.Format("{0}?city=&channel=频道&sid={1}&backurl=",target,sid);
          if(context.Request.Files.Count>0)
                {
                    var file = context.Request.Files[0];
                    HttpWebRequest request = WebRequest.Create(target) as HttpWebRequest;
                    CookieContainer cookieContainer = new CookieContainer();
                    request.CookieContainer = cookieContainer;
                    request.AllowAutoRedirect = true;
                    request.Method = "POST";
                    request.Headers.Add("Origin", "http://" + context.Request.UrlReferrer.Host);
                    request.Headers.Add("Accept-Encoding", "gzip, deflate");
                    request.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8");
                    request.Headers.Add("Upgrade-Insecure-Requests", "1");
                    request.Referer = context.Request.UrlReferrer.OriginalString;
                    string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
                    request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
                    byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("
    --" + boundary + "
    ");
                    byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("
    --" + boundary + "--
    ");
                  
                    //请求头部信息 
                    StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name="file";filename="{0}"
    Content-Type:application/octet-stream
    
    ", file.FileName));
                    byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());
                    //FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
                    byte[] bArr = new byte[file.InputStream.Length];
                    file.InputStream.Read(bArr, 0, bArr.Length);
                    file.InputStream.Close();
                    Stream postStream = request.GetRequestStream();
                    postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
                    postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
                    postStream.Write(bArr, 0, bArr.Length);
                    postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
                    postStream.Close();
                    //发送请求并获取相应回应数据
                    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                    SetCookie(response,context);
                }
            
       
            }
     //response是目标服务器的响应对象,context是返回给浏览器的上下文对象
            void SetCookie(HttpWebResponse response, HttpContext context)
            {
                foreach (Cookie cookie in response.Cookies)
                {
                    if (cookie.Name!=null&&cookie.Name.StartsWith("img"))
                    {
                        string result=string.Empty;
                        if (cookie.Value != null && cookie.Value.StartsWith("http://"))
                        {
                            Regex r = new Regex(@"^.*?(?=|)");
                            result = r.Match(cookie.Value).Value;
                        }
                        else {
                            result = cookie.Value;
                        }
                        context.Response.Write(result);
                        context.Response.End();
                    }
                
                }
            }

              因为图片服务器返回的地址是种在cookie当中的,因此代理服务器中我将相应cookie的地址接收予以返回。在开发该功能时我遇到了很多问题,图片接口同事比较忙,无法配合,后来自己模拟相应服务器的接口上传,才发现代理中并没有将文件传上去。经过比较修改,最后才上传成功。

  • 相关阅读:
    超星电子书下载攻略
    快速生成PDF书签
    2016抢票软件分享
    Win10安装framework3.5
    .NET破解之分享给新注册的朋友
    封装JedisClient.提供API实现对redis的操作
    java操作redis集群配置[可配置密码]和工具类
    redis 集群java.lang.NoSuchMethodError:SpringJAR包版本冲突错误解决方法
    linux端口开放指定端口的两种方法
    redis requires ruby version 2.2.2的解决方案
  • 原文地址:https://www.cnblogs.com/xietong/p/5741739.html
Copyright © 2020-2023  润新知