设为首页 收藏本站
查看: 1160|回复: 0

[经验分享] 大文件上传之FTP文件上传

[复制链接]

尚未签到

发表于 2015-11-6 11:14:20 | 显示全部楼层 |阅读模式
  我想很多人都知道.net自带的上传控件是不支持大文件上传的,默认情况下是4M,当然你可以通过配置WEB.CONFIG来增大上传大小,但是会影响服务器的性能.
  这里就大文件上传提供一个解决方案,就是采用FTP上传,FTP协议是支持大文件上传的.再大的都吃得消.因此,我们的目的就是再服务器上配置好FTP服务器.然后上传文件就交给FTP服务器来完成.可以手动在DOS中操作FTP服务器.也可以用代码来操作,下面是一个代码的例子,摘录自MSDN:
  FTPState.cs:
DSC0000.gif using System;
using System.Data;
using System.Configuration;
using System.Threading;
using System.Net;

DSC0001.gif DSC0002.gif
/**//// <summary>
DSC0003.gif
/// FTPState 的摘要说明
DSC0004.gif
/// </summary>
public class FTPState
...{
   
private ManualResetEvent wait;

   
private FtpWebRequest request;

   
private string fileName;

   
private Exception operationException = null;

   
string status;
   
   
public FTPState()
DSC0005.gif DSC0006.gif    
...{
        wait
= new ManualResetEvent(false);
DSC0007.gif     }


   
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(&quot;ServicePoint connections = {0}.&quot;, 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(&quot;List status: {0}&quot;, 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(&quot;anonymous&quot;, &quot;xiao_jun_0820@163.com&quot;);

        
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(&quot;anonymous&quot;, &quot;xiao_jun_0820@163.com&quot;);

        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.             版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-135829-1-1.html 上篇帖子: FTP(文件传输协议)工作原理转 下篇帖子: FTP协议命令+返回值+返回值解析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表