C# 通过ftp上载文本文档,但文件为空
以下是将txt文件从某个位置复制到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
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。