C# 在 FTP 服务器中上传一个字节 []
本文关键字:一个 字节 FTP 服务器 | 更新日期: 2023-09-27 18:33:33
我需要在FTP服务器内部上传一些数据。
在堆栈溢出帖子之后,有关如何在内部上传文件和FTP一切正常。
现在我正在尝试改进我的上传。
而不是收集数据,将它们写入文件,然后在FTP中上传文件,我想收集数据并在不创建本地文件的情况下上传它们。
为此,我执行以下操作:
string uri = "ftp://" + ftpServerIp + "/" + fileToUpload.Name;
System.Net.FtpWebRequest reqFTP;
// Create FtpWebRequest object from the Uri provided
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIp + "/" + fileToUpload.Name));
// Provide the WebPermission Credintials
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
// By default KeepAlive is true, where the control connection is not closed after a command is executed.
reqFTP.KeepAlive = false;
// Specify the command to be executed.
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
// Specify the data transfer type.
reqFTP.UseBinary = true;
byte[] messageContent = Encoding.ASCII.GetBytes(message);
// Notify the server about the size of the uploaded file
reqFTP.ContentLength = messageContent.Length;
int buffLength = 2048;
// Stream to which the file to be upload is written
Stream strm = reqFTP.GetRequestStream();
// Write Content from the file stream to the FTP Upload Stream
int total_bytes = (int)messageContent.Length;
while (total_bytes > 0)
{
strm.Write(messageContent, 0, buffLength);
total_bytes = total_bytes - buffLength;
}
strm.Close();
现在发生的情况如下:
- 我看到客户端连接到服务器
- 文件已创建
- 不传输任何数据
- 在某个时候,线程终止,连接关闭
- 如果我检查上传的文件是空的。
我要传输的数据是字符串类型,这就是为什么我做 byte[] 消息内容 = 编码.ASCII.GetBytes(message(;
我做错了什么?
此外:如果我用 ASCII 编码日期。GetBytes,在远程服务器上,我会有一个文本文件还是一个包含一些字节的文件?
谢谢你的任何建议
我在代码中看到的一个问题是,您在每次迭代时都会向服务器写入相同的字节:
while (total_bytes > 0)
{
strm.Write(messageContent, 0, buffLength);
total_bytes = total_bytes - buffLength;
}
您需要通过执行以下操作来更改偏移位置:
while (total_bytes < messageContent.Length)
{
strm.Write(messageContent, total_bytes , bufferLength);
total_bytes += bufferLength;
}
您正在尝试写入比现有数据更多的数据。您的代码一次写入 2048 字节的块,如果数据较少,您将告诉 write
方法尝试访问数组外部的字节,当然不会。
写入数据所需要做的就是:
Stream strm = reqFTP.GetRequestStream();
strm.Write(messageContent, 0, messageContent.Length);
strm.Close();
如果需要将数据写入块,则需要跟踪数组中的偏移量:
int buffLength = 2048;
int offset = 0;
Stream strm = reqFTP.GetRequestStream();
int total_bytes = (int)messageContent.Length;
while (total_bytes > 0) {
int len = Math.Min(buffLength, total_bytes);
strm.Write(messageContent, offset, len);
total_bytes -= len;
offset += len;
}
strm.Close();