大文件上传之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文件上传后的大小为0K

ftp上传到服务器分主动模式和被动模式, 外网ip上传主动模式:ftp.enterLocalActiveMode();(默认) 内网ip上传被动模式:ftp.enterLocalPassiveMo...
  • yong3269
  • yong3269
  • 2018年01月04日 12:05
  • 140

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

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

解决QNetworkAccessManager实现ftp功能后,不能上传大于1G文件的问题

最近做一个ftp上传工具,用的是QNetworkAccessManager实现ftp工具,网上很多demo 实现ftp上传,但是有一个很严重的问题,当上传的文件足够大,比如大于1G那么上传就不起作用了...
  • H5566HAO
  • H5566HAO
  • 2016年10月09日 15:28
  • 1987

ftp的get命令

一、ftp的get命令和mget命令有何不同? get一次只下载一个文件;mget一次可以下载多个文件,而且支持通配符,需要注意的是在mget的时侯,需要对每一个文件都选择y/n,如果想不交互的下载...
  • kokodudu
  • kokodudu
  • 2015年09月19日 11:09
  • 13966

PHP文件流实现大文件上传

  • 2017年08月17日 15:49
  • 30KB
  • 下载

PHP FTP 文件上传

PHP FTP 文件上传
  • wangchaoxiaoban
  • wangchaoxiaoban
  • 2016年07月29日 16:06
  • 726

php 一键上传文件,ftp上传和下载到其他服务器

没有前戏,直奔主题。 step1: 点导入按钮直接弹出这个框。 html: enctype ="multipart/form-data" method="post" id="fileFor...
  • xjw440
  • xjw440
  • 2017年01月10日 14:21
  • 1052

ftp实现大文件上传下载

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

大文件上传的实现

通过网页实现大文件(大于2GB)上传的功能,可以解决当前部分网站不支持大文件上传的问题,或者部分网站需要插件来支持的问题。该解决方案可以实现不需要安装插件就可以完成大文件(大于2GB)上传的功能。...
  • lcy4599
  • lcy4599
  • 2016年07月09日 12:15
  • 498

html5大文件上传技术

html5大文件上传技术引言 普通html表单在上传几KB或几MB级别的文件基本无压力,但在上传上百MB甚至是GB级别大文件很无爱。而且一般服务器单个文件上传限制基本都在几MB之内。如何有有效突破...
  • sinat_29804751
  • sinat_29804751
  • 2015年07月14日 12:06
  • 7295
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大文件上传之FTP文件上传
举报原因:
原因补充:

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