winform实现文件上传功能
--------------------编程问答-------------------- ftp传至服务器,或者自己写cs程序,socket传输 --------------------编程问答-------------------- --------------------编程问答-------------------- 使用 WebClient 异步上载文件 --------------------编程问答-------------------- http://dotnet.aspx.cc/article/d8f961c3-cbc1-4591-143d-236b572eb89f/read.aspx利用WebClient类向服务器上载文件 --------------------编程问答-------------------- WebClient 上传。支持大文件上传吗? --------------------编程问答-------------------- 100M没问题
具体可以用webclient的 uploadfile 和openwirte方法。
http://msdn.microsoft.com/zh-cn/library/esst63h0(v=VS.80).aspx --------------------编程问答-------------------- --------------------编程问答-------------------- 原来webclient还有这等用途,学习了.可怜的赚分之路... --------------------编程问答-------------------- FTP是首选。因为50个客户端同时上传50MB文件,HTTP服务器基本挂掉。通过HTTP方式上传文件时WEB服务器会将文件缓存到内存中,然后再写到硬盘中。
FTP是直接写到硬盘中的。而且通过FTP实现断点续传要比通过HTTP方式简单,效率要高。布署也更方便。 --------------------编程问答-------------------- 现在已经有成熟的FTP文件上传控件,可集成在WEB中,布署也方便,用户使用也方便。升级也方便。
而且同样可以自动上传指定的本地文件。
楼主有兴趣可以试试这个控件:http://www.cnblogs.com/xproer/archive/2010/04/17/1714073.html
此控件是基于标准FTP协议实现的文件上传功能。支持10G大小文件的断点续传,用户体验非常好,特别适合有超大文件上传需求的项目。
另外一个特点是支持自动上传指定的本地文件
--------------------编程问答-------------------- 还没搞定!!!!
好吧。昨天写来测试的,通过。
protected void Page_Load(object sender, EventArgs e)web页面
{
System.IO.Stream sr = Request.InputStream;
if (sr.Length > 0)
{
string filename = Request.QueryString["filename"];
int size = 1024;
byte[] by = new byte[size];
int length =sr.Read(by, 0, size);
System.IO.FileStream fs = new System.IO.FileStream(Path.Combine(Server.MapPath("Image"), filename), System.IO.FileMode.Create, System.IO.FileAccess.Write);
while (length > 0)
{
fs.Write(by, 0, by.Length);
length = sr.Read(by, 0, size);
}
fs.Close();
sr.Close();
Response.Write("Success\r\n");
}
}
下面写了两种方式上传webclient hettpwebrequest
public class UploadFile
{
/// <summary>
/// 将本地文件上传到指定的服务器(HttpWebRequest方法)
/// </summary>
/// <param name="address">文件上传到的服务器</param>
/// <param name="fileNamePath">要上传的本地文件(全路径)</param>
/// <param name="progressBar">上传进度条</param>
/// <returns>成功返回1,失败返回0</returns>
public static int Upload_Request(string address, string fileNamePath, System.Windows.Forms.ProgressBar progressBar)
{
int returnValue = 0;
// 要上传的文件
FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs);
// 根据uri创建HttpWebRequest对象
address = string.Concat(address, "?filename=", Path.GetFileName(fileNamePath));
HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(address));
httpReq.Method = "POST";
//对发送的数据不使用缓存
httpReq.AllowWriteStreamBuffering = false;
//设置获得响应的超时时间(30秒)
httpReq.Timeout = 30000;
long fileLength = fs.Length;
httpReq.ContentLength = fileLength;
try
{
progressBar.Maximum = (int)fs.Length;
progressBar.Minimum = 0;
progressBar.Value = 0;
//每次上传4k
int bufferLength = 4096;
byte[] buffer = new byte[bufferLength];
//已上传的字节数
long offset = 0;
//开始上传时间
DateTime startTime = DateTime.Now;
int size = r.Read(buffer, 0, bufferLength);
Stream postStream = httpReq.GetRequestStream();
while (size > 0)
{
postStream.Write(buffer, 0, size);
offset += size;
progressBar.Value = (int)offset;
TimeSpan span = DateTime.Now - startTime;
double second = span.TotalSeconds;
Console.WriteLine("已用时:" + second.ToString("F2") + "秒");
if (second > 0.1)
{
Console.WriteLine(" 平均速度:" + (offset / 1024 / second).ToString("0.00") + "KB/秒");
}
else
{
Console.WriteLine(" 正在连接…");
}
Console.WriteLine("已上传:" + (offset * 100.0 / fileLength).ToString("F2") + "%");
Console.WriteLine((offset / 1048576.0).ToString("F2") + "M/" + (fileLength / 1048576.0).ToString("F2") + "M");
Application.DoEvents();
size = r.Read(buffer, 0, bufferLength);
}
postStream.Close();
//获取服务器端的响应
WebResponse webRespon = httpReq.GetResponse();
Stream s = webRespon.GetResponseStream();
StreamReader sr = new StreamReader(s);
//读取服务器端返回的消息
String sReturnString = sr.ReadLine();
s.Close();
sr.Close();
if (sReturnString == "Success")
{
returnValue = 1;
}
else if (sReturnString == "Error")
{
returnValue = 0;
}
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
returnValue = 0;
}
finally
{
fs.Close();
r.Close();
}
return returnValue;
}
/// <summary>
/// 将本地文件上传到指定的服务器(WebClient方法)
/// </summary>
/// <param name="address">文件上传到的服务器</param>
/// <param name="fileNamePath">要上传的本地文件(全路径)</param>
/// <param name="progressBar">上传进度条</param>
/// <returns>成功返回1,失败返回0</returns>
public static int Upload_Client(string address, string fileNamePath, System.Windows.Forms.ProgressBar progressBar)
{
WebClient wc = new WebClient();
FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
address = string.Concat(address, "?filename=", Path.GetFileName(fileNamePath));
Stream poststream = wc.OpenWrite(address, "POST");
byte[] buffer = new byte[1024];
int mum = (int)fs.Length;
progressBar.Maximum = mum;
progressBar.Minimum = 0;
progressBar.Value = 0;
//已上传的字节数
long offset = 0;
int length = fs.Read(buffer, 0, buffer.Length);//读取长度
//开始上传时间
DateTime startTime = DateTime.Now;
while (length > 0)
{
poststream.Write(buffer, 0, length);
offset += length;
progressBar.Value = (int)offset;
TimeSpan span = DateTime.Now - startTime;
double second = span.TotalSeconds;
Console.WriteLine("已用时:" + second.ToString("F2") + "秒");
if (second > 0.1)
{
Console.WriteLine(" 平均速度:" + (offset / 1024 / second).ToString("0.00") + "KB/秒");
}
else
{
Console.WriteLine(" 正在连接…");
}
Console.WriteLine("已上传:" + (offset * 100.0 / mum).ToString("F2") + "%");
Console.WriteLine((offset / 1048576.0).ToString("F2") + "M/" + (mum / 1048576.0).ToString("F2") + "M");
Application.DoEvents();
length = fs.Read(buffer, 0, buffer.Length);
}
poststream.Close();
if (wc.QueryString.ToString() == "Success")
return 1;
else
return 0;
}
}
调用
OpenFileDialog of = new OpenFileDialog();
if (of.ShowDialog() == DialogResult.OK)
{
textBox1.Text = of.FileName;
UploadFile.Upload_Request("http://localhost:88/Default.aspx",of.FileName, progressBar1);
}
补充:.NET技术 , C#