C#文件上传同时附带参数上传

来源:互联网 发布:r语言网络爬虫 编辑:程序博客网 时间:2024/05/16 06:45

使用下面的方法就可以在上传文件的同时附带请求参数传递。方法内的部分请求参数可能需要修改。

/// <summary>        /// 文件上传        /// </summary>        /// <param name="filePath">文件路径</param>        /// <param name="stringDict">其他参数键值集合</param>        /// <returns>响应数据</returns>        public static string HttpPostData(string filePath, NameValueCollection stringDict)        {            string url = @"http://" + ip + ":" + port + "/" + api + "/fileUpload";///拼接你的文件上传接口路径                string responseContent;                var memStream = new MemoryStream();                var webRequest = (HttpWebRequest)WebRequest.Create(url);                // 边界符                var boundary = "---------------" + DateTime.Now.Ticks.ToString("x");                // 边界符                var beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");                var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);                // 最后的结束符                var endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--\r\n");                // 设置属性                webRequest.Method = "POST";                webRequest.Timeout = 600000;                webRequest.ContentType = "multipart/form-data; boundary=" + boundary;                // 写入文件    filename可能需要根据你的接口接收参数名称修改                const string filePartHeader =                    "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +                     "Content-Type: application/octet-stream\r\n\r\n";                //var header = string.Format(filePartHeader, fileKeyName, filePath);                var header = string.Format(filePartHeader, "file", filePath);                var headerbytes = Encoding.UTF8.GetBytes(header);                memStream.Write(beginBoundary, 0, beginBoundary.Length);                memStream.Write(headerbytes, 0, headerbytes.Length);                var buffer = new byte[1024];                int bytesRead; // =0                while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)                {                    memStream.Write(buffer, 0, bytesRead);                }                // 写入字符串的Key                var stringKeyHeader = "\r\n--" + boundary +                                       "\r\nContent-Disposition: form-data; name=\"{0}\"" +                                       "\r\n\r\n{1}\r\n";                foreach (byte[] formitembytes in from string key in stringDict.Keys                                                 select string.Format(stringKeyHeader, key, stringDict[key])                                                     into formitem                                                     select Encoding.UTF8.GetBytes(formitem))                {                    memStream.Write(formitembytes, 0, formitembytes.Length);                }                // 写入最后的结束边界符                memStream.Write(endBoundary, 0, endBoundary.Length);                webRequest.ContentLength = memStream.Length;                var requestStream = webRequest.GetRequestStream();                memStream.Position = 0;                var tempBuffer = new byte[memStream.Length];                memStream.Read(tempBuffer, 0, tempBuffer.Length);                memStream.Close();                requestStream.Write(tempBuffer, 0, tempBuffer.Length);                requestStream.Close();                var httpWebResponse = (HttpWebResponse)webRequest.GetResponse();                using (var httpStreamReader = new StreamReader(httpWebResponse.GetResponseStream(),                                                                Encoding.GetEncoding("utf-8")))                {                    responseContent = httpStreamReader.ReadToEnd();                }                fileStream.Close();                httpWebResponse.Close();                webRequest.Abort();                return responseContent;            }