Files
cuetools.net/CUETools.CTDB/UploadHelper/HttpUploadHelper.cs

137 lines
4.2 KiB
C#
Raw Normal View History

2010-02-18 21:12:44 +00:00
// http://aspnetupload.com
// Copyright <20> 2009 Krystalware, Inc.
//
// This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License
// http://creativecommons.org/licenses/by-sa/3.0/us/
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Specialized;
using System.Net;
using System.IO;
namespace Krystalware.UploadHelper
{
public class HttpUploadHelper
{
2010-02-23 15:15:08 +00:00
public EventHandler<UploadProgressEventArgs> onProgress;
public HttpUploadHelper()
2010-02-18 21:12:44 +00:00
{ }
2010-02-23 15:15:08 +00:00
public string Upload(string url, UploadFile[] files, NameValueCollection form)
2010-02-18 21:12:44 +00:00
{
HttpWebResponse resp = Upload((HttpWebRequest)WebRequest.Create(url), files, form);
using (Stream s = resp.GetResponseStream())
using (StreamReader sr = new StreamReader(s))
{
return sr.ReadToEnd();
}
}
2010-02-23 15:15:08 +00:00
public HttpWebResponse Upload(HttpWebRequest req, UploadFile[] files, NameValueCollection form)
2010-02-18 21:12:44 +00:00
{
List<MimePart> mimeParts = new List<MimePart>();
try
{
foreach (string key in form.AllKeys)
{
StringMimePart part = new StringMimePart();
part.Headers["Content-Disposition"] = "form-data; name=\"" + key + "\"";
part.StringData = form[key];
mimeParts.Add(part);
}
int nameIndex = 0;
foreach (UploadFile file in files)
{
StreamMimePart part = new StreamMimePart();
if (string.IsNullOrEmpty(file.FieldName))
file.FieldName = "file" + nameIndex++;
part.Headers["Content-Disposition"] = "form-data; name=\"" + file.FieldName + "\"; filename=\"" + file.FileName + "\"";
part.Headers["Content-Type"] = file.ContentType;
part.SetStream(file.Data);
mimeParts.Add(part);
}
string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
req.ContentType = "multipart/form-data; boundary=" + boundary;
req.Method = "POST";
long contentLength = 0;
byte[] _footer = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n");
foreach (MimePart part in mimeParts)
{
contentLength += part.GenerateHeaderFooterData(boundary);
}
req.ContentLength = contentLength + _footer.Length;
byte[] buffer = new byte[8192];
byte[] afterFile = Encoding.UTF8.GetBytes("\r\n");
int read;
using (Stream s = req.GetRequestStream())
{
2010-02-23 15:15:08 +00:00
long pos = 0;
2010-02-18 21:12:44 +00:00
foreach (MimePart part in mimeParts)
{
s.Write(part.Header, 0, part.Header.Length);
2010-02-23 15:15:08 +00:00
pos += part.Header.Length;
2010-02-18 21:12:44 +00:00
2010-02-23 15:15:08 +00:00
while ((read = part.Data.Read(buffer, 0, buffer.Length)) > 0)
{
if (onProgress != null)
onProgress(part,
new UploadProgressEventArgs(req.RequestUri.AbsoluteUri, ((double)pos)/contentLength));
s.Write(buffer, 0, read);
pos += read;
}
2010-02-18 21:12:44 +00:00
part.Data.Dispose();
s.Write(afterFile, 0, afterFile.Length);
2010-02-23 15:15:08 +00:00
pos += afterFile.Length;
2010-02-18 21:12:44 +00:00
}
s.Write(_footer, 0, _footer.Length);
}
return (HttpWebResponse)req.GetResponse();
}
catch
{
foreach (MimePart part in mimeParts)
if (part.Data != null)
part.Data.Dispose();
throw;
}
}
}
2010-02-23 15:15:08 +00:00
public class UploadProgressEventArgs: EventArgs
{
public string uri;
public double percent;
public UploadProgressEventArgs(string uri, double percent)
{
this.uri = uri;
this.percent = percent;
}
}
2010-02-18 21:12:44 +00:00
}