我正在尝试使用FtpWebRequest上传一些文件。这适用于小文件(比如说< 2MB),但是当我尝试加载16MB文件时,文件上传成功,但是当我调用request.GetRequestStream()。关闭时,代码挂起(如果超时则为超时)足够低)。
我可能只是a)不关闭它并且b)没有费心从服务器获得响应,但这似乎不对!请参阅下面的代码(使用SSL或不使用SSL,会出现同样的问题。)
output.Close()是挂起的行......
public static void SendFileViaFtp(string file, string url, bool useSsl, ICredentials credentials)
{
var request = (FtpWebRequest)WebRequest.Create(url + Path.GetFileName(file));
request.EnableSsl = useSsl;
request.UseBinary = true;
request.Credentials = credentials;
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Timeout = 10000000;
request.ReadWriteTimeout = 10000000;
request.KeepAlive = true;
var input = File.Open(file, FileMode.Open);
var output = request.GetRequestStream();
var buffer = new byte[1024];
var lastBytesRead = -1;
var i = 0;
while (lastBytesRead != 0)
{
i++;
lastBytesRead = input.Read(buffer, 0, 1024);
Debug.WriteLine(lastBytesRead + " " + i);
if (lastBytesRead > 0)
{
output.Write(buffer, 0, lastBytesRead);
}else
{
Debug.WriteLine("Finished");
}
}
input.Close();
output.Close();
var response = (FtpWebResponse)request.GetResponse();
response.Close();
}
谢谢,
答案 0 :(得分:5)
试
// after finished uploading
request.Abort(); // <=== MAGIC PART
// befor response.Close()
var response = (FtpWebResponse)request.GetResponse();
response.Close();
取自here
答案 1 :(得分:0)
尝试在输入前关闭输出。
确保最后一个缓冲区不大,或者你可以写几个空字节。 我不知道是否有必要,但我总是将请求内容长度设置为inputfile-length。
以下是一个很好的例子:http://dotnet-snippets.de/dns/ftp-file-upload-mit-buffer-SID886.aspx