RequestContent.cs
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
namespace PortrayUploader
{
public class RequestContent
{
private long _timeTicks;
private RequestFieldCollection _fields;
#region Properties
public long TimeTicks
{
get
{
return _timeTicks;
}
set
{
_timeTicks = value;
}
}
public RequestFieldCollection Fields
{
get
{
if(_fields == null)
{
_fields = new RequestFieldCollection();
}
return _fields;
}
set
{
_fields = value;
}
}
#endregion
#region RequestContent
public RequestContent()
{
}
public RequestContent(long timeTicks, RequestFieldCollection fields)
{
_timeTicks = timeTicks;
_fields = fields;
}
#endregion
#region GetFormData
public byte[] GetFormData()
{
List<byte> buffer = new List<byte>();
RequestField field;
byte[] buffer1 = Encoding.Default.GetBytes(string.Format("-----------------------{0:X}/r/n", _timeTicks));
foreach(RequestField f in _fields)
{
buffer.AddRange(buffer1);
field = f;
buffer.AddRange(f.GetFormData());
}
buffer1 = Encoding.Default.GetBytes(string.Format("-----------------------{0:X}--/r/n", _timeTicks));
buffer.AddRange(buffer1);
return buffer.ToArray();
}
#endregion
#region GetFormUrl
public byte[] GetFormUrl()
{
RequestField field;
StringBuilder sb = new StringBuilder();
foreach(RequestField f in _fields)
{
field = f;
sb.Append(f.GetFormUrl());
sb.Append('&');
}
if(sb.Length > 1)
{
sb.Remove(sb.Length - 1, 1);
}
return Encoding.Default.GetBytes(sb.ToString());
}
#endregion
}
}
RequestField
using System.IO;
using System.Text;
using System.Web;
namespace PortrayUploader
{
public class RequestField
{
private bool _isFile;
private string _name;
private string _value;
#region Properties
public bool IsFile
{
get
{
return _isFile;
}
set
{
_isFile = value;
}
}
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
public string Value
{
get
{
return _value;
}
set
{
_value = value;
}
}
#endregion
#region RequestField
public RequestField()
{
}
public RequestField(bool isFile, string name, string value)
{
_isFile = isFile;
_name = name;
_value = value;
}
#endregion
#region GetFormData
public byte[] GetFormData()
{
byte[] data;
byte[] buffer1;
byte[] buffer2;
string bufferStr;
if(IsFile)
{
bufferStr = string.Format("Content-Disposition: form-data; name=/"{0}/"; filename=/"{1}/"/r/nContent-Type: application/octet-stream/r/n/r/n", _name, Path.GetFileName(_value));
using(FileStream fs = new FileStream(_value, FileMode.Open, FileAccess.Read))
{
using(BinaryReader br = new BinaryReader(fs))
{
buffer2 = br.ReadBytes((int)br.BaseStream.Length);
}
}
}
else
{
bufferStr = string.Format("Content-Disposition: form-data; name=/"{0}/"", _name);
buffer2 = Encoding.Default.GetBytes(_value);
}
buffer1 = Encoding.Default.GetBytes(bufferStr);
data = new byte[buffer1.Length + buffer2.Length + 2];
buffer1.CopyTo(data, 0);
buffer2.CopyTo(data, buffer1.Length);
Encoding.Default.GetBytes("/r/n").CopyTo(data, buffer1.Length + buffer2.Length);
return data;
}
#endregion
#region GetFormUrl
public string GetFormUrl()
{
return string.Format("{0}={1}", HttpUtility.UrlEncode(_name), HttpUtility.UrlEncode(_value));
}
#endregion
}
}
RequestFieldCollection.cs
using System.Collections;
using System.Text;
namespace PortrayUploader
{
public class RequestFieldCollection : IList, ICollection, IEnumerable
{
private ArrayList requestFields;
public RequestFieldCollection()
{
this.requestFields = new ArrayList();
}
#region IList 成員
#region Add
public void Add(bool isFile, string name, string value)
{
this.Add(new RequestField(isFile, name, value));
}
public void Add(RequestField field)
{
this.requestFields.Add(field);
}
#endregion
#region AddRange
public void AddRange(RequestField[] fields)
{
if(fields == null)
{
throw new ArgumentException("fields");
}
foreach(RequestField field in fields)
{
this.Add(field);
}
}
#endregion
#region Clear
public void Clear()
{
this.requestFields.Clear();
}
#endregion
#region Contains
public bool Contains(RequestField field)
{
return this.requestFields.Contains(field);
}
#endregion
#region IndexOf
public int IndexOf(RequestField field)
{
return this.requestFields.IndexOf(field);
}
#endregion
#region Insert
public void Insert(int index, RequestField field)
{
this.requestFields.Insert(index, field);
}
#endregion
#region InsertRange
public void InsertRange(int index, RequestField[] fields)
{
if(fields == null)
{
throw new ArgumentException("fields");
}
foreach(RequestField field in fields)
{
this.Insert(index, field);
}
}
#endregion
#region IsFixedSize
public bool IsFixedSize
{
get
{
return this.requestFields.IsFixedSize;
}
}
#endregion
#region IsReadOnly
public bool IsReadOnly
{
get
{
return this.requestFields.IsReadOnly;
}
}
#endregion
#region Remove
public void Remove(RequestField field)
{
this.requestFields.Remove(field);
}
#endregion
#region RemoveAt
public void RemoveAt(int index)
{
this.requestFields.RemoveAt(index);
}
#endregion
#region RequestField[]
public RequestField this[int index]
{
get
{
return (RequestField)this.requestFields[index];
}
set
{
this.requestFields[index] = (RequestField)value;
}
}
public RequestField this[string name]
{
get
{
int index = this.FindByName(name);
if(index >= 0)
{
return this[index];
}
return null;
}
set
{
if(name == null)
{
throw new ArgumentNullException("name");
}
int index = this.FindByName(name);
if(index >= 0)
{
this[index] = (RequestField)value;
}
else
{
this.Add((RequestField)value);
}
}
}
#endregion
#region internal RequestField
internal int FindByName(string name)
{
foreach(RequestField field in this.requestFields)
{
if(field.Name == name)
{
return this.IndexOf(field);
}
}
return -1;
}
#endregion
#endregion
#region ICollection 成員
#region CopyTo
void ICollection.CopyTo(Array array, int index)
{
this.requestFields.CopyTo(array, index);
}
#endregion
#region Count
int ICollection.Count
{
get
{
return this.requestFields.Count;
}
}
#endregion
#region IsSynchronized
bool ICollection.IsSynchronized
{
get
{
return this.requestFields.IsSynchronized;
}
}
#endregion
#region SyncRoot
object ICollection.SyncRoot
{
get
{
return this.requestFields.SyncRoot;
}
}
#endregion
#endregion
#region IEnumerable 成員
#region GetEnumerator
public IEnumerator GetEnumerator()
{
return this.requestFields.GetEnumerator();
}
#endregion
#endregion
#region IList Members
int IList.Add(object field)
{
return this.requestFields.Add((RequestField)field);
}
bool IList.Contains(object field)
{
return this.Contains((RequestField)field);
}
int IList.IndexOf(object field)
{
return this.IndexOf((RequestField)field);
}
void IList.Insert(int index, object field)
{
this.Insert(index, (RequestField)field);
}
bool IList.IsFixedSize
{
get
{
return this.IsFixedSize;
}
}
bool IList.IsReadOnly
{
get
{
return this.IsReadOnly;
}
}
void IList.Remove(object field)
{
this.Remove((RequestField)field);
}
void IList.RemoveAt(int index)
{
this.RemoveAt(index);
}
object IList.this[int index]
{
get
{
return this[index];
}
set
{
this[index] = (RequestField)value;
}
}
#endregion
}
}