⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 requeststream.cs

📁 上传的控件
💻 CS
字号:
#region License

#endregion

using System;
using System.Collections;
using System.IO;
using System.Text;
using System.Web;

namespace WUSGControl.Web.Upload
{
	internal class RequestStream
	{
		#region Fields

		private ArrayList contentBody;
		private FileStatus fileStatus;
		private FileStream fs;
		private ArrayList readBody;
		private ReadStatus readStatus;
		private string originalFileName;

		#endregion

		// Nested Types
		public enum FileStatus : byte
		{
			// Fields
			Close = 1,
			Open = 0
		}

		public enum ReadStatus : byte
		{
			// Fields
			NoRead = 0,
			Read = 1
		}

		#region Properties
        /// <summary>
        /// 
        /// </summary>
		public ArrayList ContentBody
		{
			get { return this.contentBody; }
		}
        /// <summary>
        /// 
        /// </summary>
		public FileStream FileStream
		{
			get { return this.fs; }
		}
        /// <summary>
        /// 
        /// </summary>
		public FileStatus FStatus
		{
			get { return this.fileStatus; }
		}
        /// <summary>
        /// 
        /// </summary>
		public string OriginalFileName
		{
			get { return this.originalFileName; }
		}
        /// <summary>
        /// 
        /// </summary>
		public ArrayList ReadBody
		{
			get { return this.readBody; }
		}
        /// <summary>
        /// 
        /// </summary>
		public ReadStatus RStatus
		{
			get { return this.readStatus; }
		}

		#endregion

		/// <summary>
		/// 
		/// </summary>
		/// <param name="preloadBytes"></param>
		/// <param name="boundaryBytes"></param>
		/// <param name="fileStream"></param>
		/// <param name="fileStatus"></param>
		/// <param name="readStatus"></param>
		/// <param name="uploadFolder"></param>
		/// <param name="writeToDisk"></param>
		/// <param name="context"></param>
		/// <param name="currFileName"></param>
		public RequestStream(byte[] preloadBytes, byte[] boundaryBytes, FileStream fileStream,
			FileStatus fileStatus, ReadStatus readStatus, string uploadFolder, bool writeToDisk,
			HttpContext context, string currFileName)
		{
			this.readBody = new ArrayList();
			this.contentBody = new ArrayList();
			this.fs = null;
			this.originalFileName = string.Empty;
			this.fileStatus = FileStatus.Close;
			this.readStatus = ReadStatus.NoRead;
			this.originalFileName = currFileName;
			this.fs = fileStream;
			this.fileStatus = fileStatus;
			this.readStatus = readStatus;
			//关心ReadBody是怎么变化的。
			int preloadPosition = 0; //又一次从头检测,好像算法有点问题,每次都从第一个字节处判断

			////Utils.2writem("("preloadBytes的内容是 is" + Utils.GetContext().Request.ContentEncoding.GetString(preloadBytes) + "长度为 " + preloadBytes.Length);
			//Utils.2writem("("preloadBytes的长度为  " + preloadBytes.Length);
			while ((preloadPosition < preloadBytes.Length))//循环判断各节字符串,分别作处理
			{	
				ArrayList list1 = new ArrayList();//这里面存什么呢
                
				//byte[] a = Encoding.ASCII.GetString(new byte(){13});
				byte[] a = new byte[]{10};
				//If char is \r
				#region ifchar 换行符
				if (preloadBytes[preloadPosition] == 13)
				{
					int boundaryPosition = 0; 
					//这个while检测是什么意图呢  
					while (((preloadPosition < preloadBytes.Length) && (boundaryPosition < boundaryBytes.Length)))
					{
						if (preloadBytes[preloadPosition] != boundaryBytes[boundaryPosition])
						{
							break;
						}

						list1.Add(preloadBytes[preloadPosition]);

						boundaryPosition++;
						preloadPosition++;
					}
					#region if  邦定字符的位置如果等行邦定字节的长度, 说明到了分界线了
					if (boundaryPosition == boundaryBytes.Length)//如果相等说明可以读取其内容了,其内容为 "-----------------------------7d7280128049a\r\nContent-Disposition: form-data; name=\"__VIEWSTATE\"\r\n\r\ndDwxNjk4Njk0NTk0Ozs+9KBJXRpZpdzppfF8bpovAWWEL4w=\r\n-----------------------------7d7280128049a\r\nContent-Disposition: form-data; name=\"file1\"; filename=\"C:\\Documents and Settings\\Administrator\\桌面\\课题公关.txt\"\r\nContent-Type: text/plain\r\n\r\n????\r\n?е?\r\n\r\n??\r\n塢asp.net?ajax\r\n-----------------------------7d7280128049a\r\nContent-Disposition: form-data; name=\"btnUpload\"\r\n\r\nUpload file\r\n-----------------------------7d7280128049a--\r\n
					{
						//Utils.2writem("("分界线一次 boundaryPosition == boundaryBytes.Length条件成立, this.contentBody开始赋值" + "preloadBytes 的长度为 "  + preloadBytes.Length);
						if (this.fileStatus == FileStatus.Open)//当解析到最后则关闭文件流
						{
							//Utils.2writem("("文件关闭");
							this.fs.Flush(); 
							this.fs.Close();
							this.fileStatus = FileStatus.Close;
							this.originalFileName = string.Empty;
						}
						else if (this.readStatus == ReadStatus.NoRead)
						{
							this.readStatus = ReadStatus.Read;
							context.Items["Sunrise_Web_Upload_FileStatus"] = this.fileStatus;//第一次保存文件的开关状态
						}

						if ((preloadPosition + 2) < preloadBytes.Length)
						{
							list1.Add(preloadBytes[preloadPosition]);
							preloadPosition++;
							list1.Add(preloadBytes[preloadPosition]);
							preloadPosition++;

							ArrayList list2 = new ArrayList();//Content-Disposition:
							#region while2 //开始解析文件名等
							while ((preloadPosition < preloadBytes.Length))
							{
								list1.Add(preloadBytes[preloadPosition]);

								if (preloadBytes[preloadPosition] == 13)
								{
									byte[] buffer = new byte[list2.Count];
									list2.CopyTo(buffer);

									//Get request content from buffer
									string requestContent = Utils.GetContext().Request.ContentEncoding.GetString(buffer);
									//"Content-Disposition: form-data; name=\"__VIEWSTATE\""
									//If this line is content head
									if (requestContent.IndexOf("\"; filename=\"") > 0)
									{
										preloadPosition++;

										ArrayList list3 = new ArrayList();
										#region 4while 
										while ((preloadPosition < preloadBytes.Length))
										{
											list1.Add(preloadBytes[preloadPosition]);
											if (preloadBytes[preloadPosition] == 13)
											{
												if ((preloadPosition + 3) < preloadBytes.Length)
												{
													char[] spliter = new char[1]{';'};
													string[] contentArray = requestContent.Split(spliter);

													string fileNameString = contentArray[2].Trim();
													fileNameString = fileNameString.Substring(10, (fileNameString.Length - 11));//@"C:\Documents and Settings\Administrator\桌面\课题公关.txt"
													#region if
													if ((writeToDisk && (fileNameString != null)) && (fileNameString != string.Empty))
													{
														this.originalFileName = Path.GetFileName(fileNameString);//"课题公关.txt"
														preloadPosition += 3;

														byte[] buffer2 = new byte[list3.Count];
														list3.CopyTo(buffer2);

														string contentType = Utils.GetContext().Request.ContentEncoding.GetString(buffer2);//"\nContent-Type: text/plain"

														string guidFileName = (Guid.NewGuid().ToString() + Path.GetExtension(fileNameString));
														string fileFullPath = uploadFolder;

														//If upload folder deos not exist, use system temporary folder to hold the file.
														if (fileFullPath == string.Empty)
														{
															fileFullPath = Path.GetTempPath();
														}

														fileFullPath = Path.Combine(fileFullPath, guidFileName);//@"C:\WINDOWS\TEMP\a383bb31-f5db-44b5-9113-4640e8f1ddeb.txt"

														//Build the content head
														StringBuilder sb = new StringBuilder();
														string[] sbArray = new string[11];

														sbArray[0] = "\r\n";
														sbArray[1] = contentArray[0];
														sbArray[2] = ";";
														sbArray[3] = contentArray[1];
														sbArray[4] = "\r\n\r\n";
														sbArray[5] = contentType.Trim();
														sbArray[6] = ";filename=\"";
														sbArray[7] = fileNameString;
														sbArray[8] = "\";filepath=\"";
														sbArray[9] = guidFileName;
														sbArray[10] = "\"";
														sb.Append(string.Concat(sbArray));

														//Save boundary bytes to server file //字节保存到服务器中
														this.fs = new FileStream(fileFullPath, FileMode.Create);
														//Utils.2writem("("创件文件:"+fileFullPath);
														context.Items["Sunrise_Web_Upload_FileStream"] = this.fs;
														this.fileStatus = FileStatus.Open;

														context.Items["Sunrise_Web_Upload_FileStatus"] = this.fileStatus;
														Hashtable ht = ((Hashtable) context.Items["Sunrise_Web_Upload_FileList"]);
														ht.Add(Path.GetFileNameWithoutExtension(guidFileName), fileFullPath);
														context.Items["Sunrise_Web_Upload_FileList"] = ht;

														this.readBody.AddRange(boundaryBytes);
														this.readBody.AddRange(Encoding.UTF8.GetBytes(sb.ToString().ToCharArray()));

														sb.Remove(0, sb.Length);

														break;
													}
													#endregion
													preloadPosition++;
													break;
												}

												this.contentBody.AddRange(list1);
												break;
											}

											list3.Add(preloadBytes[preloadPosition]);
											preloadPosition++;
										}
										#endregion
										break;
									}

									this.readStatus = ReadStatus.NoRead;
									this.readBody.AddRange(list1);
									break;
								}

								list2.Add(preloadBytes[preloadPosition]);
								preloadPosition++;
							}
							#endregion while2
							if (preloadPosition < preloadBytes.Length)
							{
								preloadPosition++;
								continue;
							}

							this.contentBody.AddRange(list1);
							preloadPosition++;
							continue;
														
						}

						this.contentBody.AddRange(list1);
					}
						#endregion if
					else if (preloadPosition < preloadBytes.Length)
					{
						
						if (this.fileStatus == FileStatus.Open)//包含/r但不是分界线
						{
							byte[] buffer4 = new byte[list1.Count];
							for(int i = 0; i < list1.Count; i++)
							{
								buffer4[i] = ((byte) list1[i]);
							}

							this.fs.Write(buffer4, 0, buffer4.Length);//

							//Utils.2writem("("写文件流 第二层位置,流中包括元素 /r了" + preloadPosition);
					
						}
						else if (this.readStatus == ReadStatus.NoRead)
						{
							this.readBody.AddRange(list1);
						}

						preloadPosition --;
					}
					else
					{
						this.contentBody.AddRange(list1);
					}
				}
					#endregion ifchar
				else if (this.fileStatus == FileStatus.Open)
				{
					//if(preloadPosition == 49151)
						//Utils.2writem("("写字节到文件的字节位置preloadPosition is  " + preloadPosition);
					this.fs.WriteByte(preloadBytes[preloadPosition]);
				}
				else if (this.readStatus == ReadStatus.NoRead)
				{
					this.readBody.Add(preloadBytes[preloadPosition]);//Encoding.ASCII.GetString(this.readBody[0])
				}

				preloadPosition++;
			}
		}

		/// <summary>
		/// Destructor method, release all resource
		/// </summary>
		~ RequestStream()
		{
			this.readBody = null;
			this.contentBody = null;
			this.fs = null;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -