C# 上传文件到服务器(WPF)

首先是加入几个控件,只需要一个路径文件选择器、进度条、一个导入按钮就行了,其他的控件可以不需要。
在这里插入图片描述
点击导入按钮开始

private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialogTemp = new OpenFileDialog();
            DialogResult dr = openFileDialogTemp.ShowDialog();
            string address="http://localhost:50030/asmx/AddImageService.asmx/UploadImageByCS";
            string fileFullName;//上传的本地文件路径
            string fileName;//服务器上文件保存路径
            string toPath;//服务器上保存路径,自己设置就行
            //ProgressBar progressBar;
            if (dr == DialogResult.OK)
            {
             //....获取文件相关信息
             UploadFiles(address,fileFullName,toPath,fileName,progressBar);
            }
        }
 
        /// <summary>
        /// 
        /// </summary>
        /// <param name="address">服务器地址 比如http://localhost:55345/FileSave.aspx </param>
        /// <param name="fileFullName">上传的本地文件路径</param>
        ///  <param name="toPath">服务器上保存路径</param>
        /// <param name="fileName">要保存的文件名称</param>
        /// <param name="progressBar">滚动态</param>
        /// <returns></returns>
         public Int32 UploadFiles(string address, string fileFullName,string toPath, string fileName, System.Windows.Controls.ProgressBar progressBar)
        {
            int returnValue = 0;     // 要上传的文件   
            FileStream fs = new FileStream(fileFullName, FileMode.Open, FileAccess.Read);
            BinaryReader r = new BinaryReader(fs);     //时间戳   
            string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
            byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");     //请求头部信息   
            StringBuilder sb = new StringBuilder();
            sb.Append("--");
            sb.Append(strBoundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append("file");
            sb.Append("\"; filename=\"");
            sb.Append(toPath + "\\" + fileName);
            sb.Append("\";");
            sb.Append("\r\n");
            sb.Append("Content-Type: ");
            sb.Append("application/octet-stream");
            sb.Append("\r\n");
            sb.Append("\r\n");
            string strPostHeader = sb.ToString();
            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);     // 根据uri创建HttpWebRequest对象   
            HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(address));
            httpReq.Method = "POST";     //对发送的数据不使用缓存   
            httpReq.AllowWriteStreamBuffering = false;     //设置获得响应的超时时间(300秒)   
            httpReq.Timeout = 300000;
            httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary;
            long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length;
            long fileLength = fs.Length;
            httpReq.ContentLength = length;
            try
            {
                progressBar.Maximum = int.MaxValue;
                progressBar.Minimum = 0;
                progressBar.Value = 0;
                //每次上传4k  
                int bufferLength = 4096;
                byte[] buffer = new byte[bufferLength]; //已上传的字节数   
                long offset = 0;         //开始上传时间   
                DateTime startTime = DateTime.Now;
                int size = r.Read(buffer, 0, bufferLength);
                Stream postStream = httpReq.GetRequestStream();         //发送请求头部消息   
                postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);

                DateTime dateTime = startTime;
                while (size > 0)
                {
                    postStream.Write(buffer, 0, size);
                    offset += size;
                    progressBar.Value = (int)(offset * (int.MaxValue / length));
                    TimeSpan span = DateTime.Now - startTime;
                    DateTime nowTime = DateTime.Now;
                    double nowSecond = (nowTime - dateTime).TotalSeconds;
                    if (nowSecond != 0)
                    {
                        maxSpeed = (maxSpeed > (size / 1024 / nowSecond)) ? maxSpeed : (size / 1024 / nowSecond);
                        minSpeed = (minSpeed < (size / 1024 / nowSecond)) ? minSpeed : (size / 1024 / nowSecond);
                        dateTime = nowTime;
                    }
                    double second = span.TotalSeconds;
                    fileText.Content = "正在处理:" + fileFullName + "已用时:" + second.ToString("F2") + "秒";//Lab控件内容
                    UploadFilesTime.Add(second);
                    if (second > 0.001)
                    {
                        fileText.Content += "    平均速度:" + (offset / 1024 / second).ToString("0.00") + "KB/秒";
                    }
                    else
                    {
                        fileText.Content += "    正在连接…";
                    }
                    System.Windows.Forms.Application.DoEvents();
                    size = r.Read(buffer, 0, bufferLength);
                }
                progressBar.Visibility = Visibility.Hidden;
                //添加尾部的时间戳   
                postStream.Write(boundaryBytes, 0, boundaryBytes.Length);
                postStream.Close();         //获取服务器端的响应   
                WebResponse webRespon = httpReq.GetResponse();
                Stream s = webRespon.GetResponseStream();
                //读取服务器端返回的消息  
                StreamReader sr = new StreamReader(s);
                String sReturnString = sr.ReadLine();
                s.Close();
                sr.Close();
                var result= JsonConvert.DeserializeObject<ResultModel>(sReturnString);
                if (result.Flag == "1")
                {
                    //MessageBox.Show("上传成功!");
                    returnValue = 1;
                }
                else if (result.Flag != "1")
                {
                    returnValue = 0;
                }
            }
            catch(Exception ex)
            {
                returnValue = 2;//服务器连接不成功
            }
            finally
            {
                fs.Close();
                r.Close();
            }
            return returnValue;
        }

我在服务端使用的asmx接口接受文件:

 [WebMethod(Description = "上传附件")]
        public bool UploadFiles() {
         try
            {
              // 在这里对路径进行解析,因为只有这个页面能获取到Server对象      
            string path = Server.MapPath("/");
                HttpFileCollection fileCollection = HttpContext.Current.Request.Files;
                if (fileCollection != null && fileCollection.Count > 0)
                {
                    for (int i = 0; i < fileCollection.Count; i++)
                    {
                        HttpPostedFile file = fileCollection[i];
                        //...对文件进行处理
                        //得到新的文件路径imgPath
                         string imgDirectory = path + file.FileName;
                        string thumbnailDirectory = imgDirectory.Substring(0, imgDirectory.LastIndexOf(@"\"));

                        if (!Directory.Exists(thumbnailDirectory))
                        {
                            Directory.CreateDirectory(thumbnailDirectory);
                        }
                       file.SaveAs(imgDirectory);
                    }             
                }
            return true
            }
            catch (Exception e)
            {
           return false;
            }
        }
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值