如何写代码向ftp服务器传文件?

.Net提供了FtpWebRequest类,代码如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using UnityEngine;

/// <summary>
/// 与 ftp 服务器通信的类
/// </summary>
public static class FtpHelper
{
    const int MaxReconnectCount = 3;        // 最大的重新连接次数
    static int s_reconnectCounter;

    static void ResetReconnectCounter()
    {
        s_reconnectCounter = 0;
    }

    static bool ReconnectCounterIncrease()
    {
        return ++s_reconnectCounter >= MaxReconnectCount;
    }

    /// <summary>
    /// 上传文件到 ftp 服务器
    /// </summary>
    /// <param name="srcFilePath">源文件路径</param>
    /// <param name="targetUrl">目标 url</param>
    /// <param name="credential">凭证</param>
    public static void UploadFileToFTPServer(string srcFilePath, string targetUrl, NetworkCredential credential)
    {
        if (string.IsNullOrEmpty(srcFilePath))
            throw new ArgumentException("srcFilePath");
        if (string.IsNullOrEmpty(targetUrl))
            throw new ArgumentException("targetUrl");
        if (credential == null)
            throw new ArgumentNullException("credential");

        targetUrl = FixUrl(targetUrl, false);

        try
        {
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(targetUrl);
            byte[] srcFileBuffer = File.ReadAllBytes(srcFilePath);

            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Credentials = credential;
            request.ContentLength = srcFileBuffer.Length;
            request.UseBinary = true;
            request.UsePassive = true;
            request.KeepAlive = false;

            using (Stream requestStream = request.GetRequestStream())
                requestStream.Write(srcFileBuffer, 0, srcFileBuffer.Length);

            Debug.Log(string.Format("Upload file succeed, source file path: {0}, target url: {1}", srcFilePath, targetUrl));

            ResetReconnectCounter();
        }
        catch (Exception ex)
        {
            string l = string.Format("Upload file failed, upload it again. source file path: {0}, target url: {1}, error message: {2}", srcFilePath, targetUrl, ex.Message);
            Debug.LogError(l);
            if (ReconnectCounterIncrease())
                throw new WebException(l);
            else
                UploadFileToFTPServer(srcFilePath, targetUrl, credential);
        }
    }

    /// <summary>
    /// 删除 ftp 服务器上的所有文件
    /// </summary>
    /// <param name="dirUrl">文件夹 url</param>
    public static void DeleteAllFilesOnFtp(string dirUrl, NetworkCredential credential)
    {
        if (string.IsNullOrEmpty(dirUrl))
            throw new ArgumentException("dirUrl");
        if (credential == null)
            throw new ArgumentNullException("credential");

        dirUrl = FixUrl(dirUrl, true);

        List<string> dirNames, fileNames;
        GetDirectoryList(dirUrl, credential, out dirNames, out fileNames);

        foreach (var dirName in dirNames)
        {
            string url = string.Format("{0}{1}/", dirUrl, dirName);
            DeleteAllFilesOnFtp(url, credential);
        }

        foreach (var fileName in fileNames)
        {
            string url = dirUrl + fileName;
            DeleteFile(url, credential);
        }
    }

    /// <summary>
    /// 获取 ftp 文件夹的列表
    /// </summary>
    public static void GetDirectoryList(string dirUrl, NetworkCredential credential, out List<string> dirNames, out List<string> fileNames)
    {
        if (string.IsNullOrEmpty(dirUrl))
            throw new ArgumentException("dirUrl");
        if (credential == null)
            throw new ArgumentNullException("credential");

        dirUrl = FixUrl(dirUrl, true);

        dirNames = new List<string>();
        fileNames = new List<string>();

        try
        {
            var request = (FtpWebRequest)WebRequest.Create(dirUrl);

            request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
            request.Credentials = credential;
            request.UseBinary = true;
            request.UsePassive = true;
            request.KeepAlive = false;

            var response = (FtpWebResponse)request.GetResponse();
            var responseStream = response.GetResponseStream();
            var responseReader = new StreamReader(responseStream);

            while (!responseReader.EndOfStream)
            {
                string line = responseReader.ReadLine();
                if (string.IsNullOrEmpty(line))
                    continue;

                string[] words = line.Split(new char[] { ‘ ‘ }, StringSplitOptions.RemoveEmptyEntries);
                string name = words.Last();

                if (line[0] == ‘d‘)         // 表示是文件夹
                    dirNames.Add(name);
                else if (line[0] == ‘-‘)    // 表示是文件
                    fileNames.Add(name);
            }

            responseReader.Dispose();
            response.Close();
            responseStream.Dispose();
        }
        catch (Exception ex)
        {
            string l = string.Format("Get directory list failed, directory url: {0}, error message: {1}", dirUrl, ex.Message);
            Debug.LogError(l);
            throw new WebException(l);
        }
    }

    /// <summary>
    /// 删除 ftp 服务器上的文件
    /// </summary>
    public static void DeleteFile(string fileUrl, NetworkCredential credential)
    {
        if (string.IsNullOrEmpty(fileUrl))
            throw new ArgumentException("fileUrl");
        if (credential == null)
            throw new ArgumentNullException("credential");

        fileUrl = FixUrl(fileUrl, false);

        try
        {
            var request = (FtpWebRequest)WebRequest.Create(fileUrl);

            request.Method = WebRequestMethods.Ftp.DeleteFile;
            request.Credentials = credential;
            request.UseBinary = true;
            request.UsePassive = true;
            request.KeepAlive = false;

            var response = request.GetResponse();
            response.Close();

            Debug.Log(string.Format("Delete file succeed, url: {0}", fileUrl));

            ResetReconnectCounter();
        }
        catch (Exception ex)
        {
            string l = string.Format("Delete file failed, url: {0}, error message: {1}", fileUrl, ex.Message);
            Debug.LogError(l);
            if (ReconnectCounterIncrease())
                throw new WebException(l);
            else
                DeleteFile(fileUrl, credential);
        }
    }

    /// <summary>
    /// 在 ftp 服务器上创建文件夹
    /// </summary>
    /// <param name="dirUrl"></param>
    /// <param name="credential"></param>
    public static void CreateFolder(string dirUrl, NetworkCredential credential)
    {
        if (string.IsNullOrEmpty(dirUrl))
            throw new ArgumentException("dirUrl");
        if (credential == null)
            throw new ArgumentNullException("credential");

        dirUrl = FixUrl(dirUrl, false);

        string folderName = Path.GetFileNameWithoutExtension(dirUrl);
        string parentFolderUrl = dirUrl.Replace(folderName, "");
        List<string> dirNames, fileNames;

        GetDirectoryList(parentFolderUrl, credential, out dirNames, out fileNames);

        if (dirNames.Contains(folderName))
            return;

        try
        {
            var request = (FtpWebRequest)WebRequest.Create(dirUrl);

            request.Method = WebRequestMethods.Ftp.MakeDirectory;
            request.Credentials = credential;
            request.UseBinary = true;
            request.UsePassive = true;
            request.KeepAlive = false;

            var response = request.GetResponse();
            response.Close();

            Debug.Log(string.Format("Create folder succeed, url: {0}", dirUrl));

            ResetReconnectCounter();
        }
        catch (Exception ex)
        {
            string l = string.Format("Create folder failed, create again, url: {0}, error message: {1}", dirUrl, ex.Message);
            Debug.LogError(l);
            if (ReconnectCounterIncrease())
                throw new WebException(l);
            else
                CreateFolder(dirUrl, credential);
        }
    }

    static string FixUrl(string url, bool endWithSprit)
    {
        if (string.IsNullOrEmpty(url))
        {
            return url;
        }

        url = url.Replace("\\", "/").TrimEnd(‘/‘);
        return endWithSprit ? url + "/" : url;
    }
}

  

时间: 2024-08-04 07:27:46

如何写代码向ftp服务器传文件?的相关文章

C# FTP上传文件至服务器代码

C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo">需要上传的文件</param> /// <param name="targetDir">目标路径</param> /// <param name="hostname">ftp地址</param&g

C# 之 FTP服务器中文件上传与下载(三)

通过上一篇博客<C# 之 FTP服务器中文件上传与下载(二)>,我们已经实现将文件上传到我们创建的FTP服务器.今天我们就一起来看看怎么样实现从FTP服务器中下载我们所需要的文件.         我们想实现的效果是在页面上有一个超链接,超链接显示为我们想要下载的文件名.点击该文件名进入下载页面.首先我们在前台插入一个超链接,但是这个超链接为后台拼接的超链接. using System; using System.Collections.Generic; using System.Linq;

C# 之 FTP服务器中文件上传与下载(四)

        通过上一篇博客<C# 之 FTP服务器中文件上传与下载(三)>,我们已经实现将文件从我们创建的FTP服务器中下载到本地.今天就最后给大家讲解一下怎么对FTP中的文件进行重命名和删除操作. 首先在前台添加两个重命名和删除的按钮 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Defaul

使用FTP上传文件到服务器

最近做项目遇到一个功能,需要将文件上传到服务器上面,在网上看到有很多解决方案,最常用的是FTP.Socket和WebClient,这里写的基于FTP上传的. public class FTPClass { /// <summary> /// FTP /// </summary> /// <param name="Server">服务</param> /// <param name="Port">端口<

PHP使用FTP上传文件到服务器(实战篇)

我们在做开发的过程中,上传文件肯定是避免不了的,平常我们的程序和上传的文件都在一个服务器上,我们也可以使用第三方sdk上传文件,但是文件在第三方服务器上.现在我们使用PHP的ftp功能把文件上传到我们自己的服务器,我使用的linux的服务器,首先确保服务器上配置好ftp,以vsftpd为例. FTP类,此类包含把文件上传.下载.删除和删除ftp服务器目录功能,php版本>=7.0 <?php /** * Created by PhpStorm. * User: 123456 * Date: 2

Spring+Quartz实现定时从FTP服务器读取文件并存入Oracel数据库

package com.nstc.safe.action; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import 

再看ftp上传文件

前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在本地测试程序上传到ftp服务器一点问题都没有,奇怪的是当发布Web和ftp到同一个IIS下,上传文件时程序直接卡死,然后页面卡死,后来我又发现把Web和ftp分开发布在两台机器上问题又得到解决,所以当时放弃了这个方案. 再看ftp上传文件 前几天偶然看到Wolfy写到一个项目总结,其中提到了用Ser

ftp上传文件

ftp服务使用apache的commons-net进行上传操作,所以要下载commons-net的jar包,服务器采用centeros linux操作系统,运行nginx服务器,安装使用yum -y install vsftp 安装vsftp服务,并创建ftp用户. 关于vsftp与nginx的安装,百度即可. 以下是使用代码的方式上传文件 ftpUtil.java package com.taotao.utils; import java.io.File; import java.io.Fil

Java ftp 上传文件和下载文件

今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接:http://blog.csdn.net/yucaifu1989/article/details/51483118 为了方便大家对比,我吧文章代码偷了过来: import java.io.File; import java.io.FileInputStream; import java.io.Fil