📄 requeststream.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 + -