forked from szgit/Helper.Core.Library
-
Notifications
You must be signed in to change notification settings - Fork 0
/
UploadHelper.cs
141 lines (132 loc) · 6.79 KB
/
UploadHelper.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
* 作用:服务器端文件上传。
* 联系:QQ 100101392
* 来源:https://github.com/snipen/Helper.Core.Library
* */
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
namespace Helper.Core.Library
{
public class UploadHelper
{
#region 对外公开方法
/// <summary>
/// 文件上传
/// </summary>
/// <param name="httpUrl">上传 URL</param>
/// <param name="httpPostedFile">转发 HttpPostedFile</param>
/// <param name="httpPostedFileName">HttpPostedFile 名称</param>
/// <param name="parameterList">参数列表</param>
/// <param name="cookieContainer">CookieContainer</param>
/// <param name="timeout">超时</param>
/// <returns></returns>
public static string Upload(string httpUrl, System.Web.HttpPostedFileBase httpPostedFile, string httpPostedFileName = "file", Dictionary<string, object> parameterList = null, CookieContainer cookieContainer = null, int timeout = 20000)
{
return UploadItem(httpUrl, (byte[] buffer) =>
{
httpPostedFile.InputStream.Read(buffer, 0, buffer.Length);
}, httpPostedFile.FileName, httpPostedFile.ContentLength, httpPostedFile.ContentType, httpPostedFileName, parameterList, cookieContainer, timeout);
}
/// <summary>
/// 文件上传
/// </summary>
/// <param name="httpUrl">上传 URL</param>
/// <param name="filePath">文件路径</param>
/// <param name="httpPostedFileName">HttpPostedFile 名称</param>
/// <param name="parameterList">参数列表</param>
/// <param name="cookieContainer">CookieContainer</param>
/// <param name="timeout">超时</param>
/// <returns></returns>
public static string Upload(string httpUrl, string filePath, string httpPostedFileName = "file", Dictionary<string, object> parameterList = null, CookieContainer cookieContainer = null, int timeout = 20000)
{
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
BinaryReader binaryReader = new BinaryReader(fileStream);
return UploadItem(httpUrl, (byte[] buffer) =>
{
binaryReader.Read(buffer, 0, buffer.Length);
}, Path.GetFileName(filePath), fileStream.Length, "multipart/form-data", httpPostedFileName, parameterList, cookieContainer, timeout, () =>
{
if (binaryReader != null) binaryReader.Close();
if (fileStream != null) fileStream.Close();
});
}
#endregion
#region 逻辑处理私有方法
private static string UploadItem(string httpUrl, Action<byte[]> callback, string fileName, long fileStreamLength, string contentType, string httpPostedFileName = "file", Dictionary<string, object> parameterList = null, CookieContainer cookieContainer = null, int timeout = 20000, Action disposeCallback = null)
{
HttpWebResponse httpWebResponse = null;
StreamReader streamReader = null;
Stream stream = null;
try
{
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(httpUrl);
httpWebRequest.CookieContainer = cookieContainer;
httpWebRequest.Method = "POST";
httpWebRequest.Timeout = timeout;
httpWebRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;
httpWebRequest.KeepAlive = true;
// 创建分界线
string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
byte[] boundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
// 创建内容类型
httpWebRequest.ContentType = "multipart/form-data; boundary=" + boundary;
// 创建表单数据模板
string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}";
// 读取上传文件数据流
byte[] buffer = new byte[fileStreamLength];
if (callback != null) callback(buffer);
// 写入请求流数据
string headerContent = "Content-Disposition:application/x-www-form-urlencoded; name=\"{0}\";filename=\"{1}\"\r\nContent-Type:{2}\r\n\r\n";
headerContent = string.Format(headerContent, httpPostedFileName, fileName, contentType);
// 创建 HTTP 请求头
byte[] byteHeader = System.Text.ASCIIEncoding.ASCII.GetBytes(headerContent);
// 获得响应数据流
using (stream = httpWebRequest.GetRequestStream())
{
// 写入请求流
if (parameterList != null && parameterList.Count > 0)
{
foreach (KeyValuePair<string, object> keyValuePair in parameterList)
{
stream.Write(boundaryBytes, 0, boundaryBytes.Length);//写入分界线
byte[] formBytes = System.Text.Encoding.UTF8.GetBytes(string.Format(formdataTemplate, keyValuePair.Key, keyValuePair.Value));
stream.Write(formBytes, 0, formBytes.Length);
}
}
// 写入分界线,此步骤不可省略
stream.Write(boundaryBytes, 0, boundaryBytes.Length);
// 写入请求头
stream.Write(byteHeader, 0, byteHeader.Length);
// 把文件流写入请求流
stream.Write(buffer, 0, buffer.Length);
// 写入分界线流
byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
stream.Write(trailer, 0, trailer.Length);
stream.Flush();
}
string responseText = "";
httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (streamReader = new StreamReader(httpWebResponse.GetResponseStream()))
{
responseText = streamReader.ReadToEnd();
}
httpWebResponse.Close();
return responseText;
}
catch
{
throw;
}
finally
{
if (stream != null) stream.Close();
if (streamReader != null) streamReader.Close();
if (httpWebResponse != null) httpWebResponse.Close();
if (disposeCallback != null) disposeCallback();
}
}
#endregion
}
}