大文件上传之FTP文件上传

原创 2007年09月27日 15:12:00

 我想很多人都知道.net自带的上传控件是不支持大文件上传的,默认情况下是4M,当然你可以通过配置WEB.CONFIG来增大上传大小,但是会影响服务器的性能.

这里就大文件上传提供一个解决方案,就是采用FTP上传,FTP协议是支持大文件上传的.再大的都吃得消.因此,我们的目的就是再服务器上配置好FTP服务器.然后上传文件就交给FTP服务器来完成.可以手动在DOS中操作FTP服务器.也可以用代码来操作,下面是一个代码的例子,摘录自MSDN:

FTPState.cs:

using System;
using System.Data;
using System.Configuration;
using System.Threading;
using System.Net;

/// <summary>
/// FTPState 的摘要说明
/// </summary>

public class FTPState
{
    
private ManualResetEvent wait;

    
private FtpWebRequest request;

    
private string fileName;

    
private Exception operationException = null;

    
string status;
    
    
public FTPState()
    
{
        wait 
= new ManualResetEvent(false);
    }


    
public ManualResetEvent OperationComplete
    
{
        
get return wait; }
    }


    
public FtpWebRequest Request
    
{
        
get
        
{
            
return request;
        }

        
set
        
{
            request 
= value;
        }

    }

    
public string FileName
    
{
        
get return fileName; }
        
set { fileName = value; }
    }


    
public Exception OperationException
    
{
        
get return operationException; }
        
set { operationException = value; }
    }


    
public string StateDescription
    
{
        
get return status; }
        
set { status = value; }
    }

}

FTPsupport.cs:
using System;
using System.Data;
using System.Configuration;

using System.Net;
using System.IO;
using System.Threading;

/// <summary>
/// FTPsupport 的摘要说明
/// </summary>

public class FTPsupport
{
    
public FTPsupport()
    
{
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
    }

    
public static bool ListFilesOnServer(Uri serverUri,ref string message,ref Stream responseStream)
    
{
        
// The serverUri should start with the ftp:// scheme.
        if (serverUri.Scheme != Uri.UriSchemeFtp)
        
{
            
return false;
        }

        
// Get the object used to communicate with the server.
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
        request.Method 
= WebRequestMethods.Ftp.ListDirectory;

        
// Get the ServicePoint object used for this request, and limit it to one connection.
        
// In a real-world application you might use the default number of connections (2),
        
// or select a value that works best for your application.

        ServicePoint sp 
= request.ServicePoint;
        
//Console.WriteLine("ServicePoint connections = {0}.", sp.ConnectionLimit);
        sp.ConnectionLimit = 1;

        FtpWebResponse response 
= (FtpWebResponse)request.GetResponse();
        
//Stream responseStream = null;
        
// The following streams are used to read the data returned from the server.
        StreamReader readStream = null;
        
try
        
{
            responseStream 
= response.GetResponseStream();
            readStream 
= new StreamReader(responseStream, System.Text.Encoding.UTF8);

            
if (readStream != null)
            
{
                
// Display the data received from the server.
                
//Console.WriteLine(readStream.ReadToEnd());
                message = readStream.ReadToEnd();
            }

            
//Console.WriteLine("List status: {0}", response.StatusDescription);
        }

        
finally
        
{
            
//if (readStream != null)
            
//{
            
//    readStream.Close();
            
//}
            if (response != null)
            
{
                response.Close();
            }

        }


        
return true;
    }

    
public static bool DelFile(Uri serverUri,ref string result)
    
{
        
if(serverUri.Scheme!=Uri.UriSchemeFtp)
        
{
            
return false;
        }

        FtpWebRequest request 
= (FtpWebRequest)WebRequest.Create(serverUri);
        
        request.Method 
= WebRequestMethods.Ftp.DeleteFile;

        FtpWebResponse response 
= (FtpWebResponse)request.GetResponse();

        result 
= response.StatusDescription;

        response.Close();

        
return true;
    }

    
public static bool FileDownload1(Uri serverUri,ref string content,ref Stream filestream)
    
{
        
if(serverUri.Scheme!=Uri.UriSchemeFtp)
        
{
            
return false;
        }

        FtpWebRequest request 
= (FtpWebRequest)WebRequest.Create(serverUri);

        request.Method 
= WebRequestMethods.Ftp.DownloadFile;

        FtpWebResponse response 
= (FtpWebResponse)request.GetResponse();

        filestream 
= response.GetResponseStream();

        StreamReader reader 
= new StreamReader(filestream, System.Text.Encoding.UTF8);

        content 
= reader.ReadToEnd();

        response.Close();

        
return true;
    }

    
public static bool FileDownload(Uri serverUri,ref string filestring)
    
{
        
if (serverUri.Scheme != Uri.UriSchemeFtp)
        
{
            
return false;
        }


        WebClient request 
= new WebClient();

        request.Credentials 
= new NetworkCredential("anonymous""xiao_jun_0820@163.com");

        
try
        
{
            
byte[] newFileData = request.DownloadData(serverUri);

            
//这里ref回去的是下载的文件的内容,然后在前台新建一个同类型的文件,把内容写进去就OK了.
            filestring = System.Text.Encoding.UTF8.GetString(newFileData);//这个地方可能会有点问题,如果你要下载的文件不是UTF-8形式保存的,则文件内容中的中文将变乱码,那就只能预先将FTP服务器上的文件保存为UTF-8形式.
        }

        
catch(WebException e)
        
{
            filestring 
= e.ToString();
        }

        
return true;
    }


    
public static bool FileUpLoad(string fileName,Uri serverUri)
    
{
        ManualResetEvent waitObject;

        FTPState state 
= new FTPState();

        FtpWebRequest request 
= (FtpWebRequest)WebRequest.Create(serverUri);
        request.Method 
= WebRequestMethods.Ftp.UploadFile;
        request.Credentials 
= new NetworkCredential("anonymous""xiao_jun_0820@163.com");

        state.FileName 
= fileName;
        state.Request 
= request;

        waitObject
=state.OperationComplete;

        state.Request.BeginGetRequestStream(
new AsyncCallback(EndGetStreamCallback),state);

        waitObject.WaitOne();

        
if (state.OperationException != null)
        
{
            
throw state.OperationException;
            
return false;

        }

        
else
        
{
            
return true;
        }



    }


    
private static void EndGetStreamCallback(IAsyncResult ar)
    
{
        FTPState state 
= (FTPState)ar.AsyncState;

        Stream requestStream;

        
try
        
{
            requestStream 
= state.Request.EndGetRequestStream(ar);

            
const int buffLength = 2048;
            
byte[] buffer = new byte[buffLength];
            
int count = 0;
            
int readBytes = 0;
            FileStream stream 
= File.OpenRead(state.FileName);
            
do
            
{
                readBytes 
= stream.Read(buffer, 0, buffLength);
                requestStream.Write(buffer, 
0, readBytes);
                count 
+= readBytes;
            }

            
while (readBytes != 0);
            
//发送请求之前关闭该请求流
            requestStream.Close();

            state.Request.BeginGetResponse(
new AsyncCallback(EndGetResponseCallback), state);
        }

        
catch (Exception e)
        
{
            state.OperationException 
= e;
            state.OperationComplete.Set();
            
return;
        }


    }


    
private static void EndGetResponseCallback(IAsyncResult ar)
    
{
        FTPState state 
= (FTPState)ar.AsyncState;

        FtpWebResponse response 
= null;

        
try
        
{
            response 
= (FtpWebResponse)state.Request.EndGetResponse(ar);
            response.Close();
            state.StateDescription 
= response.StatusDescription;
            state.OperationComplete.Set();
        }

        
catch (Exception e)
        
{
            state.OperationException 
= e;
            state.OperationComplete.Set();
        }


    }

}

这两个类我稍微做了点点修改,原文请查看MSDN.

相关文章推荐

FTP压缩文件上传到HDFS大小不一致的问题说明(FTP传输模式)

1、问题:将ftp文件服务器上的压缩文件通过内存流直接写入HDFS内,却发现文件不一致,MD5SUM校验也不一致。 2、分析: FTP的传输有两种方式:ASCII传输模式和二进制数据传输模式。...

Java 使用 FTP 实现大文件上传下载

Java 上传下载 1G 以上的文件可以通过 http 协议或 ftp 实现,但是 http 协议对文件上传大小有限制,而且还不稳定,因此这里使用 ftp 上传。 ftp 上传方式有两种: ...

FTP传输过程详解

介绍FTP是一种非常常见的应用,已经成为文件传输的Internet标准。FTP提供文件传输的功能,即将完整的文件从一个系统复制到另一系统,这一点与NFS(网络文件系统)所提供的文件访问功能不同。在使用...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

使用webuploader上传大文件

1.Ftp上传,2.webuploader上传

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

ftp实现大文件上传下载

Java实现FTP上传下载功能   Java FTP客户端工具包很多,在此我选用的Apache的FTPClient。这个包的获取可以通过[url]http://commons.apache.org...

用C#如何实现大文件的断点上传

最近做在做一个项目,涉及到文件上传的问题。 以前也做过文件上传。但都是些小文件,不超过2m。 这次要求上传1g以上的东西。 没办法找来资料研究了一下。 基于web的文件上传可以使用ftp和http两种...
  • zph0711
  • zph0711
  • 2014年09月18日 15:58
  • 699

C# http大文件断点续传

net里的文件上传一直都很纠结,尤其是大文件就更不用说了,这跟.net的处理机制不无关系,当我们发送一个上传请求,.net要将所有的Request Body加载到内存中再进行处理,可想而知,如果允许客...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大文件上传之FTP文件上传
举报原因:
原因补充:

(最多只允许输入30个字)