Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过ftp上载文本文档,但文件为空_C#_.net_Ftp - Fatal编程技术网

C# 通过ftp上载文本文档,但文件为空

C# 通过ftp上载文本文档,但文件为空,c#,.net,ftp,C#,.net,Ftp,以下是将txt文件从某个位置复制到ftp路径的代码段: WebRequest WRequest = WebRequest.Create(FtpPath + OriginalfileName); WRequest.Method = WebRequestMethods.Ftp.UploadFile; WRequest.Credentials = new NetworkCredential("myusername", "FtpPassword"); FileStream stream = File.O

以下是将txt文件从某个位置复制到ftp路径的代码段:

WebRequest WRequest = WebRequest.Create(FtpPath + OriginalfileName);
WRequest.Method = WebRequestMethods.Ftp.UploadFile;
WRequest.Credentials = new NetworkCredential("myusername", "FtpPassword");
FileStream stream = File.OpenRead(OriginalFilePath);
byte[] buffer = new byte[stream.Length];
Stream RStream = WRequest.GetRequestStream();
RStream.Write(buffer, 0, buffer.Length);
RStream.Close();

但ftp目标上复制的文件始终为空。为什么?

您没有用文件内容填充缓冲区。您只需在以下代码行中设置长度:

byte[] buffer = new byte[stream.Length];

您也没有在其他任何地方用文件内容填充它,所以您只是将空数据发送到FTP服务器。字节可能有一定的长度,但都是空字节。

您没有用文件内容填充缓冲区。您只需在以下代码行中设置长度:

byte[] buffer = new byte[stream.Length];

您也没有在其他任何地方用文件内容填充它,所以您只是将空数据发送到FTP服务器。字节可能有一定的长度,但都是空字节。

您可以在写入字节时应用相同类型的逻辑,但我输入的是初始大小

public static void CopyStream(Stream input, Stream output)
{

    byte[] buffer = new byte[1024];

    int bytesRead;
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, bytesRead);
    }
}

您可以在写入字节时应用相同类型的逻辑,但在我的情况下,我传入了初始大小

public static void CopyStream(Stream input, Stream output)
{

    byte[] buffer = new byte[1024];

    int bytesRead;
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, bytesRead);
    }
}

作为一个简单的解决方案,您可以使用


作为一个简单的解决方案,您可以使用

这应该起作用:

WebRequest WRequest = WebRequest.Create(FtpPath + OriginalfileName);
WRequest.Method = WebRequestMethods.Ftp.UploadFile;
WRequest.Credentials = new NetworkCredential("myusername", "FtpPassword");
using (FileStream stream = File.OpenRead(OriginalFilePath)) {
  using (Stream RStream = WRequest.GetRequestStream()) {
    stream.CopyTo(RStream);
  }
}
这应该起作用:

WebRequest WRequest = WebRequest.Create(FtpPath + OriginalfileName);
WRequest.Method = WebRequestMethods.Ftp.UploadFile;
WRequest.Credentials = new NetworkCredential("myusername", "FtpPassword");
using (FileStream stream = File.OpenRead(OriginalFilePath)) {
  using (Stream RStream = WRequest.GetRequestStream()) {
    stream.CopyTo(RStream);
  }
}

这是在asp.net core 2.1中使用IFormFile进行文件上载的解决方案

// Get the object used to communicate with the server.
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create("*******/site/wwwroot/wwwroot/images/" + TempFileName);
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.UseBinary = true;
                request.KeepAlive = false;
                request.Method = "STOR";
                request.Credentials = new NetworkCredential("***", "****");

                // Copy the contents of the file to the request stream.
                byte[] fileContents = null;

                if (vehicle.FileUpload.Length > 0)
                {
                    using (var ms = new MemoryStream())
                    {
                        await vehicle.FileUpload.CopyToAsync(ms);
                        var fileBytes = ms.ToArray();
                        fileContents = fileBytes;
                    }
                }
                request.ContentLength = fileContents.Length;

                using (Stream requestStream = request.GetRequestStream())
                {
                    requestStream.Write(fileContents, 0, fileContents.Length);
                }
这是文件的视图模型

public class VehicleSeriesViewModel
    {
        public Guid VehicleBadgeId { get; set; }
        public Guid VehicleSeriesId { get; set; }
        public string Name { get; set; }
        public DateTime CreatedAt { get; set; }
        public DateTime? UpdatedAt { get; set; }
        public IFormFile FileUpload { get; set; }
        public string PictureUrl { get; set; }
    }

这是在asp.net core 2.1中使用IFormFile进行文件上载的解决方案

// Get the object used to communicate with the server.
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create("*******/site/wwwroot/wwwroot/images/" + TempFileName);
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.UseBinary = true;
                request.KeepAlive = false;
                request.Method = "STOR";
                request.Credentials = new NetworkCredential("***", "****");

                // Copy the contents of the file to the request stream.
                byte[] fileContents = null;

                if (vehicle.FileUpload.Length > 0)
                {
                    using (var ms = new MemoryStream())
                    {
                        await vehicle.FileUpload.CopyToAsync(ms);
                        var fileBytes = ms.ToArray();
                        fileContents = fileBytes;
                    }
                }
                request.ContentLength = fileContents.Length;

                using (Stream requestStream = request.GetRequestStream())
                {
                    requestStream.Write(fileContents, 0, fileContents.Length);
                }
这是文件的视图模型

public class VehicleSeriesViewModel
    {
        public Guid VehicleBadgeId { get; set; }
        public Guid VehicleSeriesId { get; set; }
        public string Name { get; set; }
        public DateTime CreatedAt { get; set; }
        public DateTime? UpdatedAt { get; set; }
        public IFormFile FileUpload { get; set; }
        public string PictureUrl { get; set; }
    }


你一行一行地调试代码了吗?是的@SonerGönül。。原始文件大小为1kb。。。但是这里的缓冲区大小只有478字节。。那么目标文件是什么?你是否逐行调试代码?是@SonerGönül。。原始文件大小为1kb。。。但是这里的缓冲区大小只有478字节。。因此,目标文件必须将文件流转换为字节,而字节应该在缓冲区中。。对吗?你需要在While循环中写入字节。。我将发布一个应该以相同方式工作的示例,例如,如果您要使用(Stream RStream=File.OpenRead(LWFilePath))和(Stream RStream=WRequest.GetRequestStream()){byte[]buffer=new byte[FStream.Length]复制bytes;BinaryReader BReader=new System.IO.BinaryReader(FStream);buffer=BReader.ReadBytes((int)FStream.Length);RStream.Write(buffer,0,buffer.Length);RStream.Close();}这里有用于读取文件的代码示例。在您的情况下,选择“从二进制文件读取”,因为您希望获取字节,而不是字符串。因此,我必须将filestream转换为字节,而字节应该在缓冲区中。。对吗?你需要在While循环中写入字节。。我将发布一个应该以相同方式工作的示例,例如,如果您要使用(Stream RStream=File.OpenRead(LWFilePath))和(Stream RStream=WRequest.GetRequestStream()){byte[]buffer=new byte[FStream.Length]复制bytes;BinaryReader BReader=new System.IO.BinaryReader(FStream);buffer=BReader.ReadBytes((int)FStream.Length);RStream.Write(buffer,0,buffer.Length);RStream.Close();}这里有用于读取文件的代码示例。在您的情况下,选择“从二进制文件读取”,因为您希望获取它们的字节,还有Stream.CopyTo做同样的事情:是的,Gonzalo,我刚才给OP举了一个例子,解释为什么他的流没有复制任何内容。还有一个很好的例子,说明如果你想在业余时间复习,如何使用FtpWebRequest类-Stream.CopyTo做同样的事情:是的,Gonzalo,我是只是给OP一个例子,解释为什么他的流没有复制任何内容。还有一个很好的例子,说明如果你想在业余时间复习,如何使用FtpWebRequest类-我没有在FileStream类中找到copyTo函数FileStream派生自stream,从中继承CopyTo。我在FileStream类中找不到CopyTo函数FileStream派生自流,从中继承CopyTo。