c# - ftp上传太大

标签 c# .net ftp network-programming vsto

我用 C# 编写了一个函数,用于在复制到文件共享不起作用时上传文件。我注意到任何上传的文件都大约是原始文件大小的 1.5-2 倍并且是无效文件。这是代码:

public bool save_FTPUpload(FileInfo fi_attachment)
{
    bool fileSaved = false;
    string filename = fi_attachment.Name;

    while (!fileSaved)
    {
        string file_ftpURI = string.Format("{0}/{1}", ftpURI, filename);
        FtpWebRequest file_exist_request = (FtpWebRequest)FtpWebRequest.Create(file_ftpURI);
        file_exist_request.Credentials = new NetworkCredential(ftp_user, ftp_pass);
        file_exist_request.Method = WebRequestMethods.Ftp.GetFileSize;
        try
        {
            FtpWebResponse response = (FtpWebResponse)file_exist_request.GetResponse();
        }
        catch (WebException ex)
        {
            FtpWebResponse response = (FtpWebResponse)ex.Response;
            if (response.StatusCode ==
                FtpStatusCode.ActionNotTakenFileUnavailable)
            {
                FtpWebRequest upload_request = (FtpWebRequest)FtpWebRequest.Create(file_ftpURI);
                upload_request.Credentials = new NetworkCredential(ftp_user, ftp_pass);

                upload_request.Method = WebRequestMethods.Ftp.UploadFile;
                upload_request.UsePassive = true;
                upload_request.UseBinary = true;
                upload_request.KeepAlive = false;

                StreamReader attachment = new StreamReader(fi_attachment.FullName);
                byte[] attachmentData = Encoding.UTF8.GetBytes(attachment.ReadToEnd());
                upload_request.ContentLength = attachmentData.Length;

                //Stream upload_request_stream = upload_request.GetRequestStream();
                using (Stream upload_request_stream = upload_request.GetRequestStream())
                {
                    upload_request_stream.Write(attachmentData, 0, attachmentData.Length);
                    upload_request_stream.Close();
                }
                FtpWebResponse upload_response = (FtpWebResponse)upload_request.GetResponse();

                fileSaved = true;
            }
        }
    }
    return fileSaved;
}

任何有助于解决这个问题的帮助都会很棒。

最佳答案

需要以二进制方式复制文件内容,像这样:

var response = (FtpWebResponse)ex.Response;
if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) {
    FtpWebRequest upload_request = (FtpWebRequest)FtpWebRequest.Create(file_ftpURI);
    upload_request.Credentials = new NetworkCredential(ftp_user, ftp_pass);
    upload_request.Method = WebRequestMethods.Ftp.UploadFile;
    upload_request.UsePassive = true;
    upload_request.UseBinary = true;
    upload_request.KeepAlive = false;
    var attachment = File.Open(fi_attachment.FullName, FileMode.Open);
    using (Stream upload_request_stream = upload_request.GetRequestStream()) {
        attachment.CopyTo(upload_request_stream);
        upload_request_stream.Close();
    }
    var upload_response = (FtpWebResponse)upload_request.GetResponse();
    fileSaved = true;
}

您当前的程序将其读取为 UTF-8 编码的非常长的字符串,这可能是文件大小发生变化的原因。

关于c# - ftp上传太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8495064/

相关文章:

c# - 在 asp :HyperLink NavigateUrl 中调用 C# 函数

c# - 直接使用 LINQ 修改值?

c# - 返回已解析十进制的方法无法编译

.net - 从 List<Task> 中删除已完成的任务

cocoa - xcode 中的 ConnectionKit 框架不适合我

c# - 在 Razor 中检查 null 的语法糖

c# - 哪个是最高效的 DataSet 查询操作?

c# - 如何将时间设置为当天的午夜?

c++ - 如何使用 boost.asio 解析 ftp 站点?

ftp - **不匹配的条目** pam_listfile(proftpd :auth): Couldn't open/etc/ftpusers