【问题标题】:C# - How to upload bigger files using FTP? [duplicate]C# - 如何使用 FTP 上传更大的文件? [复制]
【发布时间】:2018-08-25 14:50:27
【问题描述】:

当我上传大约 12kb 及以下的文件时,下面的代码可以工作,但由于某种原因,任何超过该大小的文件都会导致程序冻结并出现错误: “底层连接已关闭:接收时发生意外错误”

是不是我做错了什么?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Net;

namespace FTP3
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void uploadFile(string filePath)
    {
        FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("ftp://175.137.158.136" + "/" + Path.GetFileName(filePath));

        request.Method = WebRequestMethods.Ftp.UploadFile;
        request.Credentials = new NetworkCredential(username, password);
        request.UsePassive = true;
        request.UseBinary = true;
        request.KeepAlive = false;

        FileStream stream = File.OpenRead(filePath);
        byte[] buffer = new byte[stream.Length];

        stream.Read(buffer, 0, buffer.Length);
        stream.Close();

        Stream reqStream = request.GetRequestStream();
        reqStream.Write(buffer, 0, buffer.Length);
        reqStream.Close();

        MessageBox.Show("Upload complete!");

    }
    private void button1_Click(object sender, EventArgs e)
    {
        uploadFile(@"C:\Users\User\Desktop\test\data.xlsx");
    }
  }
}

【问题讨论】:

    标签: c# file-upload ftp ftpwebrequest


    【解决方案1】:

    您应该以“块”的形式上传文件,而不是完全上传。所以请尝试以下方法:

    using (FileStream fileStream = File.OpenRead(filePath))
            {
                using (Stream reqStream = request.GetRequestStream())
                {
                    long curFileStreamPos = 0;
                    long chunkSize = 512;
    
                    while (curFileStreamPos < fileStream.Length)
                    {
                        if (fileStream.Length - curFileStreamPos < chunkSize)
                            chunkSize = fileStream.Length - curFileStreamPos;
    
                        byte[] buff = new byte[chunkSize];
                        fileStream.Read(buff, 0, buff.Length);
                        reqStream.Write(buff, 0, buff.Length);
    
                        curFileStreamPos += chunkSize;
                    }
    
                    reqStream.Close();
                }
                fileStream.Close();
            }
    

    我没有测试过这个sn-p,所以请特别验证索引。 如果您一次上传文件,tcp/ip 堆栈可能会因为准备要上传的数据而超时。

    此外,当您上传数百 mb 的文件时,这样您就不会创建大内存对象(在您的解决方案中最终会完全在内存中)

    【讨论】:

    • 尝试了上面的代码,同样的问题发生了:小文件被上传,大文件导致连接关闭,同时上传 0kb 的副本。会不会是我机器的问题? @dsdel
    • 亲爱的 Kevin,只是想告诉您,您应该尝试另一台远程 ftp 服务器和另一台计算机(最好是另一台计算机也使用另一个 Internet 连接)。有时防火墙会破坏连接。
    • 好的,试试看,谢谢@dsdel
    • 很好的解决方案。我试试,没关系。感谢@dsdel。 P/s: KevinLee,如果你使用 FileZilla 作为 FTP 服务器,你需要把 FileTransferExpirationTime 改大一点。
    猜你喜欢
    • 2020-07-12
    • 2013-04-10
    • 1970-01-01
    • 2021-12-13
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多