RequestStream.cs
上传用户:whjkdz
上传日期:2013-05-19
资源大小:79k
文件大小:10k
源码类别:

.net编程

开发平台:

C#

  1. #region License
  2. /*
  3. * SunriseUpload - Asp.net Upload Component
  4. *
  5. * Copyright (C) 2004 mic <mic4free@hotmail.com>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  20. *
  21. * In case your copy of SunriseUpload does not include a copy of the license, you may find it online at 
  22. * http://www.gnu.org/copyleft/gpl.html
  23. *
  24. * You can find new release of this component at http://athena.9966.org/SunriseUpload .
  25. */
  26. #endregion
  27. using System;
  28. using System.Collections;
  29. using System.IO;
  30. using System.Text;
  31. using System.Web;
  32. namespace Sunrise.Web.Upload
  33. {
  34. internal class RequestStream
  35. {
  36. #region Fields
  37. private ArrayList contentBody;
  38. private FileStatus fileStatus;
  39. private FileStream fs;
  40. private ArrayList readBody;
  41. private ReadStatus readStatus;
  42. private string originalFileName;
  43. #endregion
  44. // Nested Types
  45. public enum FileStatus : byte
  46. {
  47. // Fields
  48. Close = 1,
  49. Open = 0
  50. }
  51. public enum ReadStatus : byte
  52. {
  53. // Fields
  54. NoRead = 0,
  55. Read = 1
  56. }
  57. #region Properties
  58. public ArrayList ContentBody
  59. {
  60. get { return this.contentBody; }
  61. }
  62. public FileStream FileStream
  63. {
  64. get { return this.fs; }
  65. }
  66. public FileStatus FStatus
  67. {
  68. get { return this.fileStatus; }
  69. }
  70. public string OriginalFileName
  71. {
  72. get { return this.originalFileName; }
  73. }
  74. public ArrayList ReadBody
  75. {
  76. get { return this.readBody; }
  77. }
  78. public ReadStatus RStatus
  79. {
  80. get { return this.readStatus; }
  81. }
  82. #endregion
  83. /// <summary>
  84. /// 
  85. /// </summary>
  86. /// <param name="preloadBytes"></param>
  87. /// <param name="boundaryBytes"></param>
  88. /// <param name="fileStream"></param>
  89. /// <param name="fileStatus"></param>
  90. /// <param name="readStatus"></param>
  91. /// <param name="uploadFolder"></param>
  92. /// <param name="writeToDisk"></param>
  93. /// <param name="context"></param>
  94. /// <param name="currFileName"></param>
  95. public RequestStream(byte[] preloadBytes, byte[] boundaryBytes, FileStream fileStream,
  96. FileStatus fileStatus, ReadStatus readStatus, string uploadFolder, bool writeToDisk,
  97. HttpContext context, string currFileName)
  98. {
  99. this.readBody = new ArrayList();
  100. this.contentBody = new ArrayList();
  101. this.fs = null;
  102. this.originalFileName = string.Empty;
  103. this.fileStatus = FileStatus.Close;
  104. this.readStatus = ReadStatus.NoRead;
  105. this.originalFileName = currFileName;
  106. this.fs = fileStream;
  107. this.fileStatus = fileStatus;
  108. this.readStatus = readStatus;
  109. int preloadPosition = 0;
  110. while ((preloadPosition < preloadBytes.Length))
  111. {
  112. ArrayList list1 = new ArrayList();
  113. //If char is n
  114. if (preloadBytes[preloadPosition] == 13)
  115. {
  116. int boundaryPosition = 0;
  117. while (((preloadPosition < preloadBytes.Length) && (boundaryPosition < boundaryBytes.Length)))
  118. {
  119. if (preloadBytes[preloadPosition] != boundaryBytes[boundaryPosition])
  120. {
  121. break;
  122. }
  123. list1.Add(preloadBytes[preloadPosition]);
  124. boundaryPosition++;
  125. preloadPosition++;
  126. }
  127. if (boundaryPosition == boundaryBytes.Length)
  128. {
  129. if (this.fileStatus == FileStatus.Open)
  130. {
  131. this.fs.Flush();
  132. this.fs.Close();
  133. this.fileStatus = FileStatus.Close;
  134. this.originalFileName = string.Empty;
  135. }
  136. else if (this.readStatus == ReadStatus.NoRead)
  137. {
  138. this.readStatus = ReadStatus.Read;
  139. context.Items["Sunrise_Web_Upload_FileStatus"] = this.fileStatus;
  140. }
  141. if ((preloadPosition + 2) < preloadBytes.Length)
  142. {
  143. list1.Add(preloadBytes[preloadPosition]);
  144. preloadPosition++;
  145. list1.Add(preloadBytes[preloadPosition]);
  146. preloadPosition++;
  147. ArrayList list2 = new ArrayList();
  148. while ((preloadPosition < preloadBytes.Length))
  149. {
  150. list1.Add(preloadBytes[preloadPosition]);
  151. if (preloadBytes[preloadPosition] == 13)
  152. {
  153. byte[] buffer = new byte[list2.Count];
  154. list2.CopyTo(buffer);
  155. //Get request content from buffer
  156. string requestContent = Utils.GetContext().Request.ContentEncoding.GetString(buffer);
  157. //If this line is content head
  158. if (requestContent.IndexOf(""; filename="") > 0)
  159. {
  160. preloadPosition++;
  161. ArrayList list3 = new ArrayList();
  162. while ((preloadPosition < preloadBytes.Length))
  163. {
  164. list1.Add(preloadBytes[preloadPosition]);
  165. if (preloadBytes[preloadPosition] == 13)
  166. {
  167. if ((preloadPosition + 3) < preloadBytes.Length)
  168. {
  169. char[] spliter = new char[1]{';'};
  170. string[] contentArray = requestContent.Split(spliter);
  171. string fileNameString = contentArray[2].Trim();
  172. fileNameString = fileNameString.Substring(10, (fileNameString.Length - 11));
  173. if ((writeToDisk && (fileNameString != null)) && (fileNameString != string.Empty))
  174. {
  175. this.originalFileName = Path.GetFileName(fileNameString);
  176. preloadPosition += 3;
  177. byte[] buffer2 = new byte[list3.Count];
  178. list3.CopyTo(buffer2);
  179. string contentType = Utils.GetContext().Request.ContentEncoding.GetString(buffer2);
  180. string guidFileName = (Guid.NewGuid().ToString() + Path.GetExtension(fileNameString));
  181. string fileFullPath = uploadFolder;
  182. //If upload folder deos not exist, use system temporary folder to hold the file.
  183. if (fileFullPath == string.Empty)
  184. {
  185. fileFullPath = Path.GetTempPath();
  186. }
  187. fileFullPath = Path.Combine(fileFullPath, guidFileName);
  188. //Build the content head
  189. StringBuilder sb = new StringBuilder();
  190. string[] sbArray = new string[11];
  191. sbArray[0] = "rn";
  192. sbArray[1] = contentArray[0];
  193. sbArray[2] = ";";
  194. sbArray[3] = contentArray[1];
  195. sbArray[4] = "rnrn";
  196. sbArray[5] = contentType.Trim();
  197. sbArray[6] = ";filename="";
  198. sbArray[7] = fileNameString;
  199. sbArray[8] = "";filepath="";
  200. sbArray[9] = guidFileName;
  201. sbArray[10] = """;
  202. sb.Append(string.Concat(sbArray));
  203. //Save boundary bytes to server file
  204. this.fs = new FileStream(fileFullPath, FileMode.Create);
  205. context.Items["Sunrise_Web_Upload_FileStream"] = this.fs;
  206. this.fileStatus = FileStatus.Open;
  207. context.Items["Sunrise_Web_Upload_FileStatus"] = this.fileStatus;
  208. Hashtable ht = ((Hashtable) context.Items["Sunrise_Web_Upload_FileList"]);
  209. ht.Add(Path.GetFileNameWithoutExtension(guidFileName), fileFullPath);
  210. context.Items["Sunrise_Web_Upload_FileList"] = ht;
  211. this.readBody.AddRange(boundaryBytes);
  212. this.readBody.AddRange(Encoding.UTF8.GetBytes(sb.ToString().ToCharArray()));
  213. sb.Remove(0, sb.Length);
  214. break;
  215. }
  216. preloadPosition++;
  217. break;
  218. }
  219. this.contentBody.AddRange(list1);
  220. break;
  221. }
  222. list3.Add(preloadBytes[preloadPosition]);
  223. preloadPosition++;
  224. }
  225. break;
  226. }
  227. this.readStatus = ReadStatus.NoRead;
  228. this.readBody.AddRange(list1);
  229. break;
  230. }
  231. list2.Add(preloadBytes[preloadPosition]);
  232. preloadPosition++;
  233. }
  234. if (preloadPosition < preloadBytes.Length)
  235. {
  236. preloadPosition++;
  237. continue;
  238. }
  239. this.contentBody.AddRange(list1);
  240. preloadPosition++;
  241. continue;
  242. /*
  243. if ((preloadBytes[preloadPosition] != 0x2d) || ((preloadPosition + 3) >= preloadBytes.Length))
  244. {
  245. preloadPosition++;
  246. continue;
  247. }
  248. this.readBody.AddRange(boundaryBytes);
  249. byte[] buffer3 = new byte[4] {0x2d, 0x2d, 13, 10};
  250. this.readBody.AddRange(buffer3);
  251. return;
  252. */
  253. }
  254. this.contentBody.AddRange(list1);
  255. }
  256. else if (preloadPosition < preloadBytes.Length)
  257. {
  258. if (this.fileStatus == FileStatus.Open)
  259. {
  260. byte[] buffer4 = new byte[list1.Count];
  261. for(int i = 0; i < list1.Count; i++)
  262. {
  263. buffer4[i] = ((byte) list1[i]);
  264. }
  265. this.fs.Write(buffer4, 0, buffer4.Length);
  266. }
  267. else if (this.readStatus == ReadStatus.NoRead)
  268. {
  269. this.readBody.AddRange(list1);
  270. }
  271. preloadPosition --;
  272. }
  273. else
  274. {
  275. this.contentBody.AddRange(list1);
  276. }
  277. }
  278. else if (this.fileStatus == FileStatus.Open)
  279. {
  280. this.fs.WriteByte(preloadBytes[preloadPosition]);
  281. }
  282. else if (this.readStatus == ReadStatus.NoRead)
  283. {
  284. this.readBody.Add(preloadBytes[preloadPosition]);
  285. }
  286. preloadPosition++;
  287. }
  288. }
  289. /// <summary>
  290. /// Destructor method, release all resource
  291. /// </summary>
  292. ~ RequestStream()
  293. {
  294. this.readBody = null;
  295. this.contentBody = null;
  296. this.fs = null;
  297. }
  298. }
  299. }