asp.net 如何 上传下载超大附件 唯有送分以表谢意 RT 求解··· 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 <!-- 通过 <httpRuntime> 节可以配置 ASP.NET 使用的 上传文件的上传时间,从而实现超大文件上传。 --> <httpRuntime executionTimeout="36000" maxRequestLength="951200" useFullyQualifiedRedirectUrl="true" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" enableVersionHeader="true" />在Web.config的system.web这里加上面这句 <!-- 通过 <httpRuntime> 节可以配置 ASP.NET 使用的 上传文件的上传时间,从而实现超大文件上传。 --> <httpRuntime executionTimeout="36000" maxRequestLength="951200" useFullyQualifiedRedirectUrl="true" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" enableVersionHeader="true" />在Web.config的system.web这里加上面这句 我没试过 用sliverlight可以么?http://www.51aspx.com/CV/SilverlightMultiFileUploader/ activex 拆分上传否则就别指望了,正常上传都是保存到服务器内存中,可想而知,服务器受得了嘛 upupupupupupupupupupupupupupupupupupupupupupupupup 上传可以在web。config进行相应的配置下载可以分多块读取, 超大是多大,如果太大的话,可以考虑用ftp的方式来做。 参考内容:http://www.cnblogs.com/stg609/archive/2008/07/26/1252231.htmlhttp://www.it503.com/asp.net/asp.netchangjianwenti/13902_1.html 大文件您可以使用C#的套接字和FTP开发的IP端口连接,然后使用命令去上传文件因为使用HTTP协议上传大文件是很慢而且常常超时! using System;using System.Collections.Generic;using System.Text;using System.Net.Sockets;using System.Net;using System.IO;namespace LHC.Core{ public class FTPClient { #region///内部变量 /// <summary> /// 服务器返回的应答信息(包含应答码) /// </summary> private string strMsg; /// <summary> /// 服务器返回的应答信息(包含应答码) /// </summary> private string strReply; /// <summary> /// 服务器返回的应答码 /// </summary> private int iReplyCode; /// <summary> /// 进行控制连接的socket /// </summary> private Socket socketControl; /// <summary> /// 传输模式 /// </summary> private TransferType trType; /// <summary> /// 接收和发送数据的缓冲区 /// </summary> private static int BLOCK_SIZE = 512; Byte[] buffer = new Byte[BLOCK_SIZE]; /// <summary> /// 编码方式 /// </summary> Encoding ASCII = Encoding.ASCII; #endregion #region ///字段GET/SET访问器 /// <summary> /// FTP服务器IP地址 /// </summary> private string strRemoteHost; public string RemoteHost { get { return strRemoteHost; } set { strRemoteHost = value; } } /// <summary> /// FTP服务器端口 /// </summary> private int strRemotePort; public int RemotePort { get { return strRemotePort; } set { strRemotePort = value; } } /// <summary> /// 当前服务器目录 /// </summary> private string strRemotePath; public string RemotePath { get { return strRemotePath; } set { strRemotePath = value; } } /// <summary> /// 登录用户账号 /// </summary> private string strRemoteUser; public string RemoteUser { set { strRemoteUser = value; } } /// <summary> /// 用户登录密码 /// </summary> private string strRemotePass; public string RemotePass { set { strRemotePass = value; } } /// <summary> /// 是否登录 /// </summary> private Boolean bConnected; public bool Connected { get { return bConnected; } } #endregion #region ///构造函数 /// <summary> /// 默认构造函数 /// </summary> public FTPClient() { // FTP服务IP地址 strRemoteHost = ""; // 当前服务器路径 strRemotePath = ""; // 用户登陆账号 strRemoteUser = ""; // 用户登陆密码 strRemotePass = ""; // FTP服务端口 strRemotePort = 21; // 是否登陆 bConnected = false; } /// <summary> /// 有参构造函数 /// </summary> /// <param name="remoteHost">FTP服务IP地址</param> /// <param name="remotePath">当前服务器路径</param> /// <param name="remoteUser">用户登陆账号</param> /// <param name="remotePass">用户登陆密码</param> /// <param name="remotePort">FTP服务端口</param> public FTPClient(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort) { // 初始化 strRemoteHost = remoteHost; strRemotePath = remotePath; strRemoteUser = remoteUser; strRemotePass = remotePass; strRemotePort = remotePort; // 建立连接 Connect(); } #endregion #region///建立服务器连接,和关闭连接 /// <summary> /// 建立连接 /// </summary> public void Connect() { // 建立套接字 socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // IP/端口映射类 IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort); // 开始链接 try { // 连接到指定IP/端口(网络地址) socketControl.Connect(ep); } catch (Exception) { throw new IOException("无法连接到终端服务,请检查IP地址或端口是否正确"); } // 发送命令,FTP服务器获取返回数据 ReadReply(); #region /////////////////////////// 处理返回数据信息 /////////////////////////// // 返回答应码不为220(连接成功),则抛出异常 if (iReplyCode != 220) { // 关闭连接 DisConnect(); // 抛出异常 throw new IOException(strReply.Substring(4)); } // 开始进入FTP登陆.... SendCommand("USER " + strRemoteUser); // 检查用户正确性 if (!(iReplyCode == 331 || iReplyCode == 230)) { CloseSocketConnect();//关闭连接 throw new IOException(strReply.Substring(4)); } // 检查密码正确性 if (iReplyCode != 230) { SendCommand("PASS " + strRemotePass); if (!(iReplyCode == 230 || iReplyCode == 202)) { CloseSocketConnect();//关闭连接 throw new IOException(strReply.Substring(4)); } } // 设置为可登陆 bConnected = true; // 切换到指定目录 ChDir(strRemotePath); #endregion } /// <summary> /// 关闭连接 /// </summary> public void DisConnect() { if (socketControl != null) { SendCommand("QUIT"); } CloseSocketConnect(); } #endregion #region /////////////////////////// 目录操作方法 /////////////////////////// /// <summary> /// 却换目录 /// </summary> /// <param name="strDirName">指定切换的目录</param> public void ChDir(string strDirName) { // 检查参数合法性 if (strDirName.Equals(".") || strDirName.Equals("")) { return; } // 检查是否可连接 if (!bConnected) { // 末连接,进行连接 Connect(); } // 发送命令 CWD(却换到指定目录DOS命令) SendCommand("CWD " + strDirName); // 操作失败 if (iReplyCode != 250) { //抛出异常 throw new IOException(strReply.Substring(4)); } // 指定当前目录 this.strRemotePath = strDirName; } /// <summary> /// 获得文件列表 /// </summary> /// <param name="strMask">文件名的匹配字符串</param> /// <returns>返回文件列表</returns> public string[] Dir(string strMask) { // 判断是否连接 if (!bConnected) { // 末连接,进行连接 Connect(); } //建立进行数据连接的socket Socket socketData = CreateDataSocket(); //传送命令 SendCommand("NLST " + strMask); //分析应答代码 if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226)) { throw new IOException(strReply.Substring(4)); } //获得结果 strMsg = ""; while (true) { int iBytes = socketData.Receive(buffer, buffer.Length, 0); strMsg += ASCII.GetString(buffer, 0, iBytes); if (iBytes < buffer.Length) { break; } } char[] seperator = { '\n' }; string[] strsFileList = strMsg.Split(seperator); socketData.Close();//数据socket关闭时也会有返回码 if (iReplyCode != 226) { ReadReply(); if (iReplyCode != 226) { throw new IOException(strReply.Substring(4)); } } return strsFileList; } #endregion #region /////////////////////////// 文件操作方法 /////////////////////////// /// <summary> /// 获取文件大小 /// </summary> /// <param name="strFileName">文件路径名</param> /// <returns>文件大小</returns> private long GetFileSize(string strFileName) { //检查是否存在连接 if (!bConnected) { //不存在,建立连接 Connect(); } // 发送处理请求 SendCommand("SIZE " + Path.GetFileName(strFileName)); // 处理结果 long lSize = 0; if (iReplyCode == 213) { lSize = Int64.Parse(strReply.Substring(4)); } else { throw new IOException(strReply.Substring(4)); } return lSize; } /// <summary> /// 删除 /// </summary> /// <param name="strFileName">待删除文件名</param> public void Delete(string strFileName) { // 检查是否存在连接 if (!bConnected) { //不存在,建立连接 Connect(); } // 发送处理请求 SendCommand("DELE " + strFileName); // 处理结果 if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } } #endregion #region /////////////////////////// 辅助方法 /////////////////////////// /// <summary> /// 返回FTP返回的应答码 /// </summary> private void ReadReply() { strMsg = ""; strReply = ReadLine(); iReplyCode = Int32.Parse(strReply.Substring(0, 3)); } /// <summary> /// 发送命令并获取应答码和最后一行应答字符串 /// </summary> /// <param name="strCommand">命令</param> private void SendCommand(String strCommand) { // 转换数据类型 byte[] cmdBytes = Encoding.GetEncoding("gb2312").GetBytes((strCommand + "\r\n").ToCharArray()); // 发送命令 socketControl.Send(cmdBytes, cmdBytes.Length, 0); // 调用应答码处理方法 ReadReply(); } /// <summary> /// 关闭socket连接(用于登录以前) /// </summary> private void CloseSocketConnect() { if (socketControl != null) { socketControl.Close(); socketControl = null; } bConnected = false; } /// <summary> /// 传输模式:二进制类型、ASCII类型 /// </summary> public enum TransferType { Binary, ASCII }; /// <summary> /// 设置传输模式 /// </summary> /// <param name="ttType">传输模式</param> public void SetTransferType(TransferType ttType) { if (ttType == TransferType.Binary) { SendCommand("TYPE I");//binary类型传输 } else { SendCommand("TYPE A");//ASCII类型传输 } if (iReplyCode != 200) { throw new IOException(strReply.Substring(4)); } else { trType = ttType; } } /// <summary> /// 获得传输模式 /// </summary> /// <returns>传输模式</returns> public TransferType GetTransferType() { return trType; } #endregion #region 文件操作 /// <summary> /// 重命名(如果新文件名与已有文件重名,将覆盖已有文件) /// </summary> /// <param name="strOldFileName">旧文件名</param> /// <param name="strNewFileName">新文件名</param> public void Rename(string strOldFileName, string strNewFileName) { if (!bConnected) { Connect(); } SendCommand("RNFR " + strOldFileName); if (iReplyCode != 350) { throw new IOException(strReply.Substring(4)); } // 如果新文件名与原有文件重名,将覆盖原有文件 SendCommand("RNTO " + strNewFileName); if (iReplyCode != 250) { throw new IOException(strReply.Substring(4)); } } #endregion #region 上传和下载 /// <summary> /// 下载一批文件 /// </summary> /// <param name="strFileNameMask">文件名的匹配字符串</param> /// <param name="strFolder">本地目录(不得以\结束)</param> public void Get(string strFileNameMask, string strFolder) { if (!bConnected) { Connect(); } string[] strFiles = Dir(strFileNameMask); foreach (string strFile in strFiles) 设置<httpRuntime maxRequestLength="51200" executionTimeout="3600" appRequestQueueLimit="10000"/> 断点续传用HttpWorkerRequest,GetPreloadedEntityBody 和 ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据 那个编辑器不够大··发送不了FTP的操作 在ASP.NET中处理大文件上传 参考 博客园信息http://www.cnblogs.com/zk09/archive/2010/04/14/1711818.html 如果文件很大的话,还是要用别人提供的上传组件,若文件太大的话,设置web.config也没作用,或者自己可以写段代码将文件分割上传 多线程。。上传 下载using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Threading;namespace SeptWolves.Comm{ //文件多线程上传类 public class ThreadFileUp { //临时文件大小数组 private int[] filesizew; //临时文件名 private string[] filenamew; //临时文件上传状态 private bool[] threadw; //临时文件起点位置 private int[] filestartw; //线程数 private int thread; //愿文件读取流 private FileStream fsread = null; //保存文件路径 private string NewFilePath; //临时文件存放路径 private string TempSavePath; /// <summary> /// 多线程上传文件 /// </summary> /// <param name="FileUpPath">上传文件全路径</param> /// <param name="SavePath">保存文件路径(不包括后缀名)</param> /// <param name="TempPath">保存临时文件的路径</param> /// <param name="threadnum">线程数</param> /// <returns>返回:结果集</returns> public SeptWolves.Comm.FileUpImg FileUpLoad(string FileUpPath, string SavePath, string TempPath, int threadnum) { string name = DateTime.Now.ToString("yyyyMMddHHmmssmsus"); NewFilePath = SavePath + "." + FileUpPath.Split('.')[FileUpPath.Split('.').Length - 1]; thread = threadnum; TempSavePath = TempPath; FileUpImg result = new FileUpImg(); result.Flag = false; if (!File.Exists(FileUpPath)) { result.Result = "上传不存在!"; return result; } //文件大小 long filesize = 0; FileInfo file = new FileInfo(FileUpPath); filesize = file.Length; //获取文件大小 //初始化数组 threadw = new bool[thread]; filesizew = new int[thread]; filestartw = new int[thread]; filenamew = new string[thread]; //计算每个线程的平均接受文件大小 int filethread = ((int)filesize / thread) - 1; //平均分配 int filethreade = ((int)filesize % thread)-1; //剩余全部 //数组赋值 for (int i = 0; i < thread; i++) { threadw[i] = false; //每个线程状态的初始值为假 filenamew[i] = name + "_" + i + ".dat"; //每个临时文件的文件名 filestartw[i] = filethread * i; //每个临时文件的起点 filesizew[i] = filethread; //每个临时文件的大小 } filesizew[thread - 1] += filethreade; //最后一个临时文件大小+剩余部分 //读取原文件流 fsread = new FileStream(FileUpPath, FileMode.Open); //启用上传线程 for (int i = 0; i < thread; i++) { Thread thraed = new Thread(new ParameterizedThreadStart(receive)); thraed.Start(i); } //合并 string hbresult = hbfile(); if (hbresult != "") { result.Result = hbresult; return result; } //关闭读取流 fsread.Close(); result.Flag = true; result.Name = NewFilePath.Split('/')[NewFilePath.Split('/').Length-1]; result.Result = "上传成功!"; return result; } // <summary> /// 线程调的方法 (上传文件) /// </summary> private void receive(object j) { int i = (int)j; //文件名 string filename = filenamew[i]; FileStream fs = null; try { fs = new FileStream(TempSavePath + filename, FileMode.Create); //根据文件名称和文件打开模式来初始化FileStream文件流实例 BinaryWriter TempWriter = new BinaryWriter(fs); fsread.Position = filestartw[i]; //以文件的全路对应的字符串和文件打开模式来初始化FileStream文件流实例 BinaryReader SplitFileReader = new BinaryReader(fsread); byte[] TempBytes = SplitFileReader.ReadBytes((int)filesizew[i]); //从大文件中读取指定大小数据 TempWriter.Write(TempBytes); //把此数据写入小文件 TempWriter.Close(); fs.Close(); threadw[i] = true; } catch (Exception ex) { if (fs != null) { fs.Close(); } } } /// <summary> /// 合并文件 /// </summary> private string hbfile() { bool hb; //等待线程全部结束 while (true) { hb = true; for (int i = 0; i < thread; i++) { if (threadw[i] == false)//有未结束线程,等待 { hb = false; Thread.Sleep(100); break; } } if (hb == true)//所有线程均已结束,停止等待, { break; } } byte[] bytes = new byte[512]; try { FileStream AddStream = new FileStream(NewFilePath, FileMode.Create); //以合并后的文件名称和打开方式来创建、初始化FileStream文件流 BinaryWriter AddWriter = new BinaryWriter(AddStream); //以FileStream文件流来初始化BinaryWriter书写器,此用以合并分割的文件 for (int i = 0; i < thread; i++) { FileStream TempStream = new FileStream(TempSavePath + filenamew[i], FileMode.Open); //以小文件所对应的文件名称和打开模式来初始化FileStream文件流,起读取分割作用 BinaryReader TempReader = new BinaryReader(TempStream); //用FileStream文件流来初始化BinaryReader文件阅读器,也起读取分割文件作用 AddWriter.Write(TempReader.ReadBytes((int)TempStream.Length)); //读取分割文件中的数据,并生成合并后文件 TempReader.Close(); //关闭BinaryReader文件阅读器 TempStream.Close(); } AddStream.Close(); for (int i = 0; i < thread; i++) { System.IO.File.Delete(TempSavePath + filenamew[i]); } } catch (Exception ex) { return "合并文件失败!"; } return ""; } }} 这不就等于把ftp软件重写一遍啦! 用控件吧,在Web.config的system.web配置是不行的,内存占用太大,可能会死掉.去我空间下载吧,有现成的例子,还支持多种风格,够你使用了. http://download.csdn.net/source/2241772 ftp上传,还有看看jquery是不是有这样上传大文件的插件。 路过,关注,,,,,,顶顶顶、、、、、、、、、、、UPUPUP,,,,,,,,↑↑↑ 试试StorageWebPlug上传插件。新颖网络上传插件(StorageWebPlug)是一个支持超大文件(2GB,可扩展)上传的COM控件, 具备断点续传,文件MD5验证,有详细的上传进度显示,支持多种脚本语言。免费提供JavaScript SDK包。官方网站:http://www.ncmem.com产品介绍:http://www.ncmem.com/webplug/features/index.aspx下载地址:http://www.ncmem.com/download.aspx产品截图:截图-上传:截图-已上传: 建议用第三方组件,如Power-Web,AspUpload,ActiveFile,ABCUpload,aspSmartUpload,SA-FileUp 这个就可以,executionTimeout改大点,maxRequestLength最大2097151 想学DevExpress但不知道从什么地方入手,迷茫,求助 dll注册失败 银联支付 asp.net中上传文件时突发情况处理问题? 乱码问题 dispose()方法的问题 困扰我两个多星期的问题 Asp.net中如何还原SQL数据库? 一个简单窗体传值问题,在线急等! 问一个ASP。NET程序拷贝到它机继续做开发会出现的问题。 在客户端利用webservice.htc调用webservice乱码 关于验证码 reportviewer 无法加载客户端打印控件
上传文件的上传时间,从而实现超大文件上传。
-->
<httpRuntime executionTimeout="36000" maxRequestLength="951200" useFullyQualifiedRedirectUrl="true" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" enableVersionHeader="true" />在Web.config的system.web这里加上面这句
通过 <httpRuntime> 节可以配置 ASP.NET 使用的
上传文件的上传时间,从而实现超大文件上传。
-->
<httpRuntime executionTimeout="36000" maxRequestLength="951200" useFullyQualifiedRedirectUrl="true" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" enableVersionHeader="true" />在Web.config的system.web这里加上面这句
http://www.51aspx.com/CV/SilverlightMultiFileUploader/
否则就别指望了,正常上传都是保存到服务器内存中,可想而知,服务器受得了嘛
下载可以分多块读取,
http://www.it503.com/asp.net/asp.netchangjianwenti/13902_1.html
因为使用HTTP协议上传大文件是很慢而且常常超时!
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.IO;namespace LHC.Core
{
public class FTPClient
{
#region///内部变量
/// <summary>
/// 服务器返回的应答信息(包含应答码)
/// </summary>
private string strMsg;
/// <summary>
/// 服务器返回的应答信息(包含应答码)
/// </summary>
private string strReply;
/// <summary>
/// 服务器返回的应答码
/// </summary>
private int iReplyCode;
/// <summary>
/// 进行控制连接的socket
/// </summary>
private Socket socketControl;
/// <summary>
/// 传输模式
/// </summary>
private TransferType trType;
/// <summary>
/// 接收和发送数据的缓冲区
/// </summary>
private static int BLOCK_SIZE = 512;
Byte[] buffer = new Byte[BLOCK_SIZE];
/// <summary>
/// 编码方式
/// </summary>
Encoding ASCII = Encoding.ASCII;
#endregion #region ///字段GET/SET访问器
/// <summary>
/// FTP服务器IP地址
/// </summary>
private string strRemoteHost;
public string RemoteHost
{
get
{
return strRemoteHost;
}
set
{
strRemoteHost = value;
}
}
/// <summary>
/// FTP服务器端口
/// </summary>
private int strRemotePort;
public int RemotePort
{
get
{
return strRemotePort;
}
set
{
strRemotePort = value;
}
}
/// <summary>
/// 当前服务器目录
/// </summary>
private string strRemotePath;
public string RemotePath
{
get
{
return strRemotePath;
}
set
{
strRemotePath = value;
}
}
/// <summary>
/// 登录用户账号
/// </summary>
private string strRemoteUser;
public string RemoteUser
{
set
{
strRemoteUser = value;
}
}
/// <summary>
/// 用户登录密码
/// </summary>
private string strRemotePass;
public string RemotePass
{
set
{
strRemotePass = value;
}
} /// <summary>
/// 是否登录
/// </summary>
private Boolean bConnected;
public bool Connected
{
get
{
return bConnected;
}
}
#endregion
#region ///构造函数
/// <summary>
/// 默认构造函数
/// </summary>
public FTPClient()
{
// FTP服务IP地址
strRemoteHost = "";
// 当前服务器路径
strRemotePath = "";
// 用户登陆账号
strRemoteUser = "";
// 用户登陆密码
strRemotePass = "";
// FTP服务端口
strRemotePort = 21;
// 是否登陆
bConnected = false;
}
/// <summary>
/// 有参构造函数
/// </summary>
/// <param name="remoteHost">FTP服务IP地址</param>
/// <param name="remotePath">当前服务器路径</param>
/// <param name="remoteUser">用户登陆账号</param>
/// <param name="remotePass">用户登陆密码</param>
/// <param name="remotePort">FTP服务端口</param>
public FTPClient(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort)
{
// 初始化
strRemoteHost = remoteHost;
strRemotePath = remotePath;
strRemoteUser = remoteUser;
strRemotePass = remotePass;
strRemotePort = remotePort;
// 建立连接
Connect();
}
#endregion #region///建立服务器连接,和关闭连接 /// <summary>
/// 建立连接
/// </summary>
public void Connect()
{
// 建立套接字
socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// IP/端口映射类
IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort);
// 开始链接
try
{
// 连接到指定IP/端口(网络地址)
socketControl.Connect(ep);
}
catch (Exception)
{
throw new IOException("无法连接到终端服务,请检查IP地址或端口是否正确");
}
// 发送命令,FTP服务器获取返回数据
ReadReply(); #region /////////////////////////// 处理返回数据信息 ///////////////////////////
// 返回答应码不为220(连接成功),则抛出异常
if (iReplyCode != 220)
{
// 关闭连接
DisConnect();
// 抛出异常
throw new IOException(strReply.Substring(4));
}
// 开始进入FTP登陆....
SendCommand("USER " + strRemoteUser);
// 检查用户正确性
if (!(iReplyCode == 331 || iReplyCode == 230))
{
CloseSocketConnect();//关闭连接
throw new IOException(strReply.Substring(4));
}
// 检查密码正确性
if (iReplyCode != 230)
{
SendCommand("PASS " + strRemotePass);
if (!(iReplyCode == 230 || iReplyCode == 202))
{
CloseSocketConnect();//关闭连接
throw new IOException(strReply.Substring(4));
}
} // 设置为可登陆
bConnected = true; // 切换到指定目录
ChDir(strRemotePath); #endregion
}
/// <summary>
/// 关闭连接
/// </summary>
public void DisConnect()
{
if (socketControl != null)
{
SendCommand("QUIT");
}
CloseSocketConnect();
}
#endregion
#region /////////////////////////// 目录操作方法 ///////////////////////////
/// <summary>
/// 却换目录
/// </summary>
/// <param name="strDirName">指定切换的目录</param>
public void ChDir(string strDirName)
{
// 检查参数合法性
if (strDirName.Equals(".") || strDirName.Equals(""))
{
return;
}
// 检查是否可连接
if (!bConnected)
{
// 末连接,进行连接
Connect();
}
// 发送命令 CWD(却换到指定目录DOS命令)
SendCommand("CWD " + strDirName);
// 操作失败
if (iReplyCode != 250)
{
//抛出异常
throw new IOException(strReply.Substring(4));
}
// 指定当前目录
this.strRemotePath = strDirName;
}
/// <summary>
/// 获得文件列表
/// </summary>
/// <param name="strMask">文件名的匹配字符串</param>
/// <returns>返回文件列表</returns>
public string[] Dir(string strMask)
{
// 判断是否连接
if (!bConnected)
{
// 末连接,进行连接
Connect();
} //建立进行数据连接的socket
Socket socketData = CreateDataSocket(); //传送命令
SendCommand("NLST " + strMask); //分析应答代码
if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226))
{
throw new IOException(strReply.Substring(4));
} //获得结果
strMsg = "";
while (true)
{
int iBytes = socketData.Receive(buffer, buffer.Length, 0);
strMsg += ASCII.GetString(buffer, 0, iBytes);
if (iBytes < buffer.Length)
{
break;
}
}
char[] seperator = { '\n' };
string[] strsFileList = strMsg.Split(seperator);
socketData.Close();//数据socket关闭时也会有返回码
if (iReplyCode != 226)
{
ReadReply();
if (iReplyCode != 226)
{
throw new IOException(strReply.Substring(4));
}
}
return strsFileList;
}
#region /////////////////////////// 文件操作方法 ///////////////////////////
/// <summary>
/// 获取文件大小
/// </summary>
/// <param name="strFileName">文件路径名</param>
/// <returns>文件大小</returns>
private long GetFileSize(string strFileName)
{
//检查是否存在连接
if (!bConnected)
{
//不存在,建立连接
Connect();
} // 发送处理请求
SendCommand("SIZE " + Path.GetFileName(strFileName)); // 处理结果
long lSize = 0;
if (iReplyCode == 213)
{
lSize = Int64.Parse(strReply.Substring(4));
}
else
{
throw new IOException(strReply.Substring(4));
}
return lSize;
} /// <summary>
/// 删除
/// </summary>
/// <param name="strFileName">待删除文件名</param>
public void Delete(string strFileName)
{
// 检查是否存在连接
if (!bConnected)
{
//不存在,建立连接
Connect();
}
// 发送处理请求
SendCommand("DELE " + strFileName); // 处理结果
if (iReplyCode != 250)
{
throw new IOException(strReply.Substring(4));
}
}
#endregion
#region /////////////////////////// 辅助方法 /////////////////////////// /// <summary>
/// 返回FTP返回的应答码
/// </summary>
private void ReadReply()
{
strMsg = "";
strReply = ReadLine();
iReplyCode = Int32.Parse(strReply.Substring(0, 3));
} /// <summary>
/// 发送命令并获取应答码和最后一行应答字符串
/// </summary>
/// <param name="strCommand">命令</param>
private void SendCommand(String strCommand)
{
// 转换数据类型
byte[] cmdBytes = Encoding.GetEncoding("gb2312").GetBytes((strCommand + "\r\n").ToCharArray());
// 发送命令
socketControl.Send(cmdBytes, cmdBytes.Length, 0);
// 调用应答码处理方法
ReadReply();
} /// <summary>
/// 关闭socket连接(用于登录以前)
/// </summary>
private void CloseSocketConnect()
{
if (socketControl != null)
{
socketControl.Close();
socketControl = null;
}
bConnected = false;
}
/// <summary>
/// 传输模式:二进制类型、ASCII类型
/// </summary>
public enum TransferType { Binary, ASCII };
/// <summary>
/// 设置传输模式
/// </summary>
/// <param name="ttType">传输模式</param>
public void SetTransferType(TransferType ttType)
{
if (ttType == TransferType.Binary)
{
SendCommand("TYPE I");//binary类型传输
}
else
{
SendCommand("TYPE A");//ASCII类型传输
}
if (iReplyCode != 200)
{
throw new IOException(strReply.Substring(4));
}
else
{
trType = ttType;
}
}
/// <summary>
/// 获得传输模式
/// </summary>
/// <returns>传输模式</returns>
public TransferType GetTransferType()
{
return trType;
}
#endregion
#region 文件操作
/// <summary>
/// 重命名(如果新文件名与已有文件重名,将覆盖已有文件)
/// </summary>
/// <param name="strOldFileName">旧文件名</param>
/// <param name="strNewFileName">新文件名</param>
public void Rename(string strOldFileName, string strNewFileName)
{
if (!bConnected)
{
Connect();
}
SendCommand("RNFR " + strOldFileName);
if (iReplyCode != 350)
{
throw new IOException(strReply.Substring(4));
}
// 如果新文件名与原有文件重名,将覆盖原有文件
SendCommand("RNTO " + strNewFileName);
if (iReplyCode != 250)
{
throw new IOException(strReply.Substring(4));
}
}
#endregion
#region 上传和下载
/// <summary>
/// 下载一批文件
/// </summary>
/// <param name="strFileNameMask">文件名的匹配字符串</param>
/// <param name="strFolder">本地目录(不得以\结束)</param>
public void Get(string strFileNameMask, string strFolder)
{
if (!bConnected)
{
Connect();
}
string[] strFiles = Dir(strFileNameMask);
foreach (string strFile in strFiles)
断点续传
用HttpWorkerRequest,GetPreloadedEntityBody 和 ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据
参考 博客园信息
http://www.cnblogs.com/zk09/archive/2010/04/14/1711818.html
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;namespace SeptWolves.Comm
{
//文件多线程上传类
public class ThreadFileUp
{
//临时文件大小数组
private int[] filesizew;
//临时文件名
private string[] filenamew;
//临时文件上传状态
private bool[] threadw;
//临时文件起点位置
private int[] filestartw;
//线程数
private int thread;
//愿文件读取流
private FileStream fsread = null;
//保存文件路径
private string NewFilePath;
//临时文件存放路径
private string TempSavePath; /// <summary>
/// 多线程上传文件
/// </summary>
/// <param name="FileUpPath">上传文件全路径</param>
/// <param name="SavePath">保存文件路径(不包括后缀名)</param>
/// <param name="TempPath">保存临时文件的路径</param>
/// <param name="threadnum">线程数</param>
/// <returns>返回:结果集</returns>
public SeptWolves.Comm.FileUpImg FileUpLoad(string FileUpPath, string SavePath, string TempPath, int threadnum)
{
string name = DateTime.Now.ToString("yyyyMMddHHmmssmsus");
NewFilePath = SavePath + "." + FileUpPath.Split('.')[FileUpPath.Split('.').Length - 1];
thread = threadnum;
TempSavePath = TempPath; FileUpImg result = new FileUpImg();
result.Flag = false;
if (!File.Exists(FileUpPath))
{
result.Result = "上传不存在!";
return result;
} //文件大小
long filesize = 0;
FileInfo file = new FileInfo(FileUpPath);
filesize = file.Length; //获取文件大小 //初始化数组
threadw = new bool[thread];
filesizew = new int[thread];
filestartw = new int[thread];
filenamew = new string[thread]; //计算每个线程的平均接受文件大小
int filethread = ((int)filesize / thread) - 1; //平均分配
int filethreade = ((int)filesize % thread)-1; //剩余全部 //数组赋值
for (int i = 0; i < thread; i++)
{
threadw[i] = false; //每个线程状态的初始值为假
filenamew[i] = name + "_" + i + ".dat"; //每个临时文件的文件名
filestartw[i] = filethread * i; //每个临时文件的起点
filesizew[i] = filethread; //每个临时文件的大小
} filesizew[thread - 1] += filethreade; //最后一个临时文件大小+剩余部分 //读取原文件流
fsread = new FileStream(FileUpPath, FileMode.Open); //启用上传线程
for (int i = 0; i < thread; i++)
{
Thread thraed = new Thread(new ParameterizedThreadStart(receive));
thraed.Start(i);
} //合并
string hbresult = hbfile();
if (hbresult != "")
{
result.Result = hbresult;
return result;
}
//关闭读取流
fsread.Close(); result.Flag = true;
result.Name = NewFilePath.Split('/')[NewFilePath.Split('/').Length-1];
result.Result = "上传成功!";
return result;
} // <summary>
/// 线程调的方法 (上传文件)
/// </summary>
private void receive(object j)
{
int i = (int)j;
//文件名
string filename = filenamew[i]; FileStream fs = null; try
{
fs = new FileStream(TempSavePath + filename, FileMode.Create);
//根据文件名称和文件打开模式来初始化FileStream文件流实例
BinaryWriter TempWriter = new BinaryWriter(fs);
fsread.Position = filestartw[i];
//以文件的全路对应的字符串和文件打开模式来初始化FileStream文件流实例
BinaryReader SplitFileReader = new BinaryReader(fsread);
byte[] TempBytes = SplitFileReader.ReadBytes((int)filesizew[i]);
//从大文件中读取指定大小数据
TempWriter.Write(TempBytes);
//把此数据写入小文件
TempWriter.Close();
fs.Close();
threadw[i] = true;
}
catch (Exception ex)
{
if (fs != null)
{
fs.Close();
}
}
} /// <summary>
/// 合并文件
/// </summary>
private string hbfile()
{
bool hb;
//等待线程全部结束
while (true)
{
hb = true;
for (int i = 0; i < thread; i++)
{
if (threadw[i] == false)//有未结束线程,等待
{
hb = false;
Thread.Sleep(100);
break;
}
}
if (hb == true)//所有线程均已结束,停止等待,
{
break;
}
} byte[] bytes = new byte[512]; try
{
FileStream AddStream = new FileStream(NewFilePath, FileMode.Create);
//以合并后的文件名称和打开方式来创建、初始化FileStream文件流
BinaryWriter AddWriter = new BinaryWriter(AddStream);
//以FileStream文件流来初始化BinaryWriter书写器,此用以合并分割的文件
for (int i = 0; i < thread; i++)
{
FileStream TempStream = new FileStream(TempSavePath + filenamew[i], FileMode.Open);
//以小文件所对应的文件名称和打开模式来初始化FileStream文件流,起读取分割作用
BinaryReader TempReader = new BinaryReader(TempStream);
//用FileStream文件流来初始化BinaryReader文件阅读器,也起读取分割文件作用
AddWriter.Write(TempReader.ReadBytes((int)TempStream.Length));
//读取分割文件中的数据,并生成合并后文件
TempReader.Close();
//关闭BinaryReader文件阅读器
TempStream.Close();
} AddStream.Close(); for (int i = 0; i < thread; i++)
{
System.IO.File.Delete(TempSavePath + filenamew[i]);
}
}
catch (Exception ex)
{
return "合并文件失败!";
}
return "";
}
}
}
去我空间下载吧,有现成的例子,还支持多种风格,够你使用了.
新颖网络上传插件(StorageWebPlug)是一个支持超大文件(2GB,可扩展)上传的COM控件, 具备断点续传,文件MD5验证,有详细的上传进度显示,支持多种脚本语言。免费提供JavaScript SDK包。
官方网站:http://www.ncmem.com
产品介绍:http://www.ncmem.com/webplug/features/index.aspx
下载地址:http://www.ncmem.com/download.aspx产品截图:
截图-上传:截图-已上传:
这个就可以,executionTimeout改大点,maxRequestLength最大2097151