上传过程中出现 No Responding

limii 2009-09-09 09:12:46
我用FtpWebRequest写了一个上传的东西,文件限制在100MB以内,我试着上传一个70多兆的文件,上传到10多兆时页面就没有显示了,标题栏上显示No Responding,但是能看服务器里那个文件一直在被上传,文件大小在变大。请问达人这个是什么问题?怎么解决?会不会跟线程有关?我不懂线程,敬候高手指点!
以上是点击“上传”后的代码:

protected void Uploading(object sender, EventArgs e)
{
string fileName = file1.PostedFile.FileName;
Uri siteUri = new Uri(hoster + "/" + Path.GetFileName(fileName));
FtpWebRequest request = FtpWebRequest.Create(siteUri) as FtpWebRequest;
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(user, pwd);
request.UsePassive = false;//true;
request.UseBinary = true;
request.KeepAlive = false;

FileStream stream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
Stream reqStream = request.GetRequestStream();
int chunksize = 4096;
byte[] buffer = new byte[chunksize];
int bytesRead = stream.Read(buffer, 0, chunksize);
while (bytesRead > 0)
{
reqStream.Write(buffer, 0, bytesRead);
bytesRead = stream.Read(buffer, 0, chunksize);
}
stream.Close();
reqStream.Close();
}
...全文
555 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
limii 2009-09-11
  • 打赏
  • 举报
回复
现在上传了40多兆还没问题。
顺便再请教Sandy945一下,网页中播放视频,但不确定视频格式,有可能是FLV,有可能是WMV或是其它,怎么播放?因为如果用EMBED,不能播放FLV;如果要播放FLV,就只能用FLASH,但FLASH又不能播放WMV,不知Sandy945兄有没有什么建议?
limii 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 sandy945 的回复:]
会执行 catch
[/Quote]
catch执行完了会回到while吧?
阿非 2009-09-11
  • 打赏
  • 举报
回复
会执行 catch
limii 2009-09-11
  • 打赏
  • 举报
回复
不用try catch,这是我的坏习惯。
菜鸟问一道小菜:代码结构为
while
{
try
{
}
catch
{
}
}
的时候,如果try中的代码出的问题,会去执行catch中的代码,之后还是会回到while继续吧?
阿非 2009-09-11
  • 打赏
  • 举报
回复

try
{
/*我加的代码
bytesSent += readBytes;
size.InnerText = bytesSent
percent.InnerText = string.Format("{0:0.00}%", (float)bytesSent * 100 / fileSize);
xml.Save(Server.MapPath("upload.xml"));
完*/
}
catch(Exception e)
{}


catch(Exception e) 中的 Exception 可以换成 因为另一个文件在使用 的异常
limii 2009-09-11
  • 打赏
  • 举报
回复
对啊!!
问题有望最终解决,先碰个杯,回头再报告!
阿非 2009-09-11
  • 打赏
  • 举报
回复
不是的,你没明白~ 上传 与 保存XML 文件 是两个操作,

只是你目前的代码把它们写在一个try catch 中了

你将它们分离一下 就不会互相影响了


try
{
requestStream = state.Request.EndGetRequestStream(ar);
// Copy the file contents to the request stream.
const int bufferLength = 2048;
byte[] buffer = new byte[bufferLength];
int count = 0;
int readBytes = 0;
FileStream stream = File.OpenRead(state.FileName);
do
{
readBytes = stream.Read(buffer, 0, bufferLength);
try
{
/*我加的代码
bytesSent += readBytes;
size.InnerText = bytesSent
percent.InnerText = string.Format("{0:0.00}%", (float)bytesSent * 100 / fileSize);
xml.Save(Server.MapPath("upload.xml"));
完*/
}
catch(Exception e)
{}
requestStream.Write(buffer, 0, readBytes);
count += readBytes;
}
while (readBytes != 0);
Console.WriteLine ("Writing {0} bytes to the stream.", count);
// IMPORTANT: Close the request stream before sending the request.
requestStream.Close();
// Asynchronously get the response to the upload request.
state.Request.BeginGetResponse(
new AsyncCallback (EndGetResponseCallback),
state
);
}
// Return exceptions to the main application thread.
catch (Exception e)
{
Console.WriteLine("Could not get the request stream.");
state.OperationException = e;
state.OperationComplete.Set();
return;
}

limii 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 sandy945 的回复:]
你把save 的代码放在 一个单独的try 里 在catch() 后面写 上传的代码

这样就不影响了
[/Quote]
想法严重相同!
现在正上传了10几兆。
不过我发现,如果在CATCH里的上传代码又冲突了怎么办?总不能在CATCH里又嵌套无数个try catch吧?
因为上传的代码结构是:
while(bytesRead>0)
{
try
{

}
catch
{
while(bytesRead>0)
{

}
}
}
我希望的是,在catch不用while,执行完catch里的代码后回到开头的那个while去
阿非 2009-09-11
  • 打赏
  • 举报
回复
你把save 的代码放在 一个单独的try 里 在catch() 后面写 上传的代码

这样就不影响了
limii 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 sandy945 的回复:]
C# code
XmlDocument xml=new XmlDocument();
xml.Load(Server.MapPath("upload.xml"));
你可以换成
C# code
XmlDocument xml=new XmlDocument();string xmlStr="<?xml version='1.0' encoding='gb2312'?> ...";
xml.LoadXml(xmlStr);
XmlNode root= xml.DocumentElement;
XmlNode size= root.SelectSingleNode("size");
XmlNode total= root.SelectSingleNode("total");
XmlNode percent= root.SelectSingleNode("percent");
并把这段代码的定义放到 EndGetStreamCallback 这个函数的外面,

因为这个是回调函数 肯定会多次调用,放到外面 会避免xml 加载时候的冲突问题

这样如果有冲突也是 Save 的时候了

[/Quote]
加载的部分我把它放到外面了。
今早再次测试,仍然是冲突,这次是服务端代码终止运行了,上传到30多兆时报错说不能xml.Save(Server.MapPath(""))因为另一个文件在使用。
现在我在考虑,有没有一种方法,在xml.Save(Server.MapPath(""))失败时,放弃保存,但继续运行后面的代码(比如继续上传)?
阿非 2009-09-11
  • 打赏
  • 举报
回复
不用了~ 你留着以后问问题吧~
limii 2009-09-11
  • 打赏
  • 举报
回复
晕,好像不能直接加分,我再起个贴子,麻烦你会接另外的30分哈:)
yankunlin 2009-09-11
  • 打赏
  • 举报
回复
学习了.......
阿非 2009-09-11
  • 打赏
  • 举报
回复
问题解决了就好~
limii 2009-09-11
  • 打赏
  • 举报
回复
刚才下载到80%多的时候开始无法得到新的数据,但至少不会No Responding了,等到上传完毕时也可以得到下载完毕的信息,所以如果把秒数加大点也许就可以将就用了。以后再完善。
该结贴了,非常感谢Sandy945兄的顽强回贴:)
50分再加30分送给你(没加过,呆会看能不能加),坚决支持你!
阿非 2009-09-11
  • 打赏
  • 举报
回复
视频播放我没做过,你试试这个


<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="290" height="156">
<param name="movie" value="xxx.swf">
<param name="quality" value="high">
<param name="wmode" value="transparent">
<embed src="xxx.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" width="290" height="156"></embed>
</object>
24K純帥 2009-09-10
  • 打赏
  • 举报
回复
狼哥真厉害。。
limii 2009-09-10
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 sandy945 的回复:]
JScript codetry
{
xml.load("upload.xml");var nodeSize=xml.getElementsByTagName("size")[0];var nodeTotal=xml.getElementsByTagName("total")[0];var nodePercent=xml.getElementsByTagName("percent")[0];var ¡­
[/Quote]
报告Sandy945兄,上传到20多兆时又No Responding了,我想不明白是什么原因了,可以确定的是JS导致了这个问题,试过不执行var interl=setInterval("getSize()",1000)就可以顺利上传一个70几兆的文件而不出现无反响应
limii 2009-09-10
  • 打赏
  • 举报
回复
待会再试Sandy945兄的代码,我刚才把var interl=setInterval("getSize()",1000);秒数改成了3000,现在上传了50多兆暂时还没问题,回头再报告!谢了!
阿非 2009-09-10
  • 打赏
  • 举报
回复

try
{
xml.load("upload.xml");
var nodeSize=xml.getElementsByTagName("size")[0];
var nodeTotal=xml.getElementsByTagName("total")[0];
var nodePercent=xml.getElementsByTagName("percent")[0];

var info=document.getElementById("info");
var progress=document.getElementById("progress");
if(nodePercent!=null&&nodeSize!=null&&nodeTotal!=null)
{
var size=nodeSize.text;
var total=nodeTotal.text;
var percent=nodePercent.text;
progress.style.width=percent*300;

info.innerHTML="Uploaded: <font color='red'>"+size+"</font>/"+total+"    Percent: <font color='red'>"+percent+"</font>";
if(size=="finished")
{
clearInterval(interl);
info.innerHTML="<font color='red'>uploaded successfully</font>";
}
}
}
//加了catch
catch(e)
{
clearInterval(interl);
setTimeout(interl=setInterval("getSize()",1000),3000);
}


加载更多回复(37)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧