Esempio n. 1
0
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="url">http的访问地址</param>
        /// <param name="filePath">文件绝对路径</param>
        /// <param name="filePath">文件到服务器后的名字</param>
        /// <param name="filedName">上传时的文件参数名称</param>
        /// <param name="parameter">其他参数信息</param>
        /// <param name="d">上传回调代理</param>
        /// <returns></returns>
        public static string UploadFileRequest(string url, string filePath, string fileName, string filedName, NameValueCollection parameter = null, FileUploadDelegate d = null)
        {
            String paramString = "";

            if (parameter != null && parameter.Count > 0)
            {
                foreach (string key in parameter.Keys)
                {
                    paramString += key + "=" + parameter[key] + "&";
                }
                paramString = paramString.Substring(0, paramString.Length - 1);
                url        += "?" + paramString;
            }
            logger.Debug("url=" + url + ", param=" + paramString);

            DateTime startTime = DateTime.Now;
            string   boundary  = "----------" + DateTime.Now.Ticks.ToString("x");

            byte[]       endBytes   = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
            FileStream   fs         = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            BinaryReader br         = new BinaryReader(fs);
            long         fileLength = fs.Length;

            //请求头部信息
            StringBuilder headerBuilder = new StringBuilder();

            headerBuilder.Append("--" + boundary + "\r\n");
            headerBuilder.Append("Content-Disposition: form-data; name=\"" + filedName + "\"; filename=\"" + fileName + "\"\r\n");
            headerBuilder.Append("Content-Type: application/octet-stream");
            headerBuilder.Append("\r\n");
            headerBuilder.Append("\r\n");
            string headerString = headerBuilder.ToString();

            byte[] headerBytes = Encoding.UTF8.GetBytes(headerString);
            long   length      = fs.Length + headerBytes.Length + endBytes.Length;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));

            request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)";
            request.Method    = "POST";
            request.AllowWriteStreamBuffering = false;
            request.Timeout       = 300000;
            request.ContentType   = "multipart/form-data; boundary=" + boundary;
            request.ContentLength = length;

            Stream postStream = request.GetRequestStream();

            //写入http头
            postStream.Write(headerBytes, 0, headerBytes.Length);
            //写入文件
            int bufferLength = 4096;

            byte[] buffer = new byte[bufferLength];
            long   offset = 0;
            int    size   = 0;

            TimeSpan span     = DateTime.Now - startTime;
            double   percent  = 0;
            double   second   = span.TotalSeconds;
            double   speed    = 0;
            double   interval = 0;
            String   info     = "";

            while ((size = br.Read(buffer, 0, bufferLength)) > 0)
            {
                postStream.Write(buffer, 0, size);
                offset += size;
                span    = DateTime.Now - startTime;
                percent = (offset * 1.0 / fileLength);
                second  = span.TotalSeconds;
                speed   = (offset / second);
                info    = second.ToString("F2") + "秒 " + NumberUtil.ConversionUnitMemory(speed) + "/秒 " + (percent * 100.0).ToString("F2") + "%";
                if (d != null && second - interval > 0.5)
                {
                    interval = second;
                    d.Invoke(percent, second, speed, info);
                }
            }
            //添加尾部
            postStream.Write(endBytes, 0, endBytes.Length);
            span    = DateTime.Now - startTime;
            second  = span.TotalSeconds;
            percent = 1;
            speed   = (fileLength / second);
            info    = second.ToString("F2") + "秒 " + NumberUtil.ConversionUnitMemory(speed) + "/秒 " + (percent * 100.0).ToString("F2") + "%";
            if (d != null)
            {
                d.Invoke(percent, second, speed, info);
            }

            //读取返回
            StreamReader sr          = new StreamReader(request.GetResponse().GetResponseStream());
            string       returnValue = sr.ReadLine();

            sr.Close();
            br.Close();
            fs.Close();
            postStream.Close();
            return(returnValue);
        }
Esempio n. 2
0
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="url">http的访问地址</param>
        /// <param name="filePath">文件绝对路径</param>
        /// <param name="filePath">文件到服务器后的名字</param>
        /// <param name="filedName">上传时的文件参数名称</param>
        /// <param name="parameter">其他参数信息</param>
        /// <param name="d">上传回调代理</param>
        /// <returns></returns>
        public static string UploadFileRequest(string url, string filePath, string fileName, string filedName, NameValueCollection parameter = null, FileUploadDelegate d = null)
        {
            String paramString = "";
            if (parameter != null && parameter.Count > 0)
            {
                foreach (string key in parameter.Keys)
                {
                    paramString += key + "=" + parameter[key] + "&";
                }
                paramString = paramString.Substring(0, paramString.Length - 1);
                url += "?" + paramString;
            }
            logger.Debug("url=" + url + ", param=" + paramString);

            DateTime startTime = DateTime.Now;
            string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
            byte[] endBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
            FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
            BinaryReader br = new BinaryReader(fs);
            long fileLength = fs.Length;

            //请求头部信息
            StringBuilder headerBuilder = new StringBuilder();
            headerBuilder.Append("--" + boundary + "\r\n");
            headerBuilder.Append("Content-Disposition: form-data; name=\"" + filedName + "\"; filename=\"" + fileName + "\"\r\n");
            headerBuilder.Append("Content-Type: application/octet-stream");
            headerBuilder.Append("\r\n");
            headerBuilder.Append("\r\n");
            string headerString = headerBuilder.ToString();
            byte[] headerBytes = Encoding.UTF8.GetBytes(headerString);
            long length = fs.Length + headerBytes.Length + endBytes.Length;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
            request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)";
            request.Method = "POST";
            request.AllowWriteStreamBuffering = false;
            request.Timeout = 300000;
            request.ContentType = "multipart/form-data; boundary=" + boundary;
            request.ContentLength = length;

            Stream postStream = request.GetRequestStream();
            //写入http头
            postStream.Write(headerBytes, 0, headerBytes.Length);
            //写入文件
            int bufferLength = 4096;
            byte[] buffer = new byte[bufferLength];
            long offset = 0;
            int size = 0;

            TimeSpan span = DateTime.Now - startTime;
            double percent = 0;
            double second = span.TotalSeconds;
            double speed = 0;
            double interval = 0;
            String info = "";
            while ((size = br.Read(buffer, 0, bufferLength)) > 0)
            {
                postStream.Write(buffer, 0, size);
                offset += size;
                span = DateTime.Now - startTime;
                percent = (offset * 1.0 / fileLength);
                second = span.TotalSeconds;
                speed = (offset / second);
                info = second.ToString("F2") + "秒 " + NumberUtil.ConversionUnitMemory(speed) + "/秒 " + (percent * 100.0).ToString("F2") + "%";
                if (d != null && second - interval > 0.5)
                {
                    interval = second;
                    d.Invoke(percent, second, speed, info);
                }
            }
            //添加尾部
            postStream.Write(endBytes, 0, endBytes.Length);
            span = DateTime.Now - startTime;
            second = span.TotalSeconds;
            percent = 1;
            speed = (fileLength / second);
            info = second.ToString("F2") + "秒 " + NumberUtil.ConversionUnitMemory(speed) + "/秒 " + (percent * 100.0).ToString("F2") + "%";
            if (d != null)
            {
                d.Invoke(percent, second, speed, info);
            }

            //读取返回
            StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream());
            string returnValue = sr.ReadLine();
            sr.Close();
            br.Close();
            fs.Close();
            postStream.Close();
            return returnValue;
        }