gpt4 book ai didi

c# - 如何在用户请求中流式传输文件而不在 ASP.Net 中的内存或磁盘中缓冲请求

转载 作者:行者123 更新时间:2023-11-30 23:31:34 25 4
gpt4 key购买 nike

这是我将用户输入文件上传到 ftp 服务器的代码:

 public static bool UploadFile(string FilePath, HttpPostedFileBase file)
{
Stream ftpStream = null;
FtpWebRequest request = null;
FtpWebResponse response = null;
try
{
FtpWebRequest ftpRequest = (FtpWebRequest)WebRequest.Create(ftpURL + FilePath);
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
ftpRequest.Credentials = new NetworkCredential(UserName, Password);
ftpRequest.ContentLength = file.ContentLength;
Stream requestStream = ftpRequest.GetRequestStream();

Byte[] buffer = new Byte[buferSize];
int bytesRead = file.InputStream.Read(buffer, 0, buferSize);
while (bytesRead > 0)
{
requestStream.Write(buffer, 0, bytesRead);
bytesRead = file.InputStream.Read(buffer, 0, buferSize);
}
requestStream.Close();
return true;
}
catch (Exception)
{
return false;
}
}

它看起来工作正常。但有一个问题。当用户尝试上传文件时(一个大文件!)它需要很长时间(我认为将文件保存在主机服务器内存或磁盘中!)再拿一个!在ftp中上传很长时间。现在的问题是我可以通过我的主机将用户输入文件直接上传到 ftp 服务器吗?我的意思是使用 HttpPostedFile 我有一个来自文件的流将其保存在 Ftp 服务器中并减少上传文件时间。

(抱歉语言和信息不佳!我是 MVC 中的新手。)

最佳答案

您的代码看起来非常好。 HttpPostedFileBase 只是指向包含文件数据的底层网络流的指针(流)。这个文件永远不会在内存中完全读取,因为你只是从底层的 TCP 套接字中读取 block :这也非常好和高效。此外,您还直接将已读取的字节 block 复制到远程 FTP 服务器上的传出套接字。除了提高不同跃点之间的网络速度之外,没有什么可以优化此代码。

我只能建议使用 Stream.CopyTo 来简化您的代码的语法。方法:

var ftpRequest = (FtpWebRequest)WebRequest.Create(ftpURL + FilePath);
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
ftpRequest.Credentials = new NetworkCredential(UserName, Password);
ftpRequest.ContentLength = file.ContentLength;
using (Stream requestStream = ftpRequest.GetRequestStream())
{
file.InputStream.CopyTo(requestStream);
}
return true;

如果到此 FTP 服务器的网络连接速度很慢并且您无法控制这一小改进,我可以想到的是将上传的文件存储在您的网络服务器上,然后运行一些后台作业并将其上传到远程 FTP 服务器.这样客户就不需要等待文件上传到 FTP - 他只需要等待文件上传到您的网络服务器。

关于c# - 如何在用户请求中流式传输文件而不在 ASP.Net 中的内存或磁盘中缓冲请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34547821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com