PostedFile.SaveAs(strServerDir)之后文件变成0KB的问题.

chichenzhe 2009-11-24 01:20:30
问题类:
protected System.Web.UI.HtmlControls.HtmlInputFile m_fileLocal;
问题方法:
PostedFile.SaveAs(strServerDir)

首先,我肯定在WEB.config里设置了文件上限和timeout 最大化.
见:
<httpRuntime   executionTimeout="90"   maxRequestLength="409600"   useFullyQualifiedRedirectUrl="false"   minFreeThreads="18"   minLocalRequestFreeThreads="15"   appRequestQueueLimit="150"   enableVersionHeader="true"/>

有一点不明白:http://support.microsoft.com/kb/825739/zh-cn
executionTimeout="90"到底是不是90秒呢?


但是现在就是出问题了.
SaveAs之后 发现服务器上的文件为0KB.(2个月的使用以来 首次发现这个问题.) 不太可能是 异常了,因为后续代码都执行了.

怎么修改?

google搜索发现基本上只有英文论坛提及了这个问题.
贴个地址:http://community.discountasp.net/showthread.php?t=5146
可惜的是 跟帖描述的解决方法不适用.因为我早就设置了上传的大小和timeout.
...全文
570 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
mengyun1986 2009-12-11
  • 打赏
  • 举报
回复
上传前先判断下,给个提示

int fileLength =fileUpload.PostedFile.ContentLength;
if (fileLength == 0)
{
Alert("请关闭本地打开的文件后再上传");
return;
}
fileUpload.PostedFile.SaveAs(Server.MapPath(fileName));
mengyun1986 2009-12-11
  • 打赏
  • 举报
回复
100分就这样没啦。。。楼主啊,追加点分吧。。。
mengyun1986 2009-12-11
  • 打赏
  • 举报
回复
本来是来查找问题的,没有找到原因,只有自己研究啦,终于发现错误的原因:
你在本地打开了要上传的文件,导致上传失败。
您可以测试一下看看,把你打开的文件关闭掉,就上传成功啦。
camperer 2009-11-25
  • 打赏
  • 举报
回复
确实很诡异。。
telankes2000 2009-11-25
  • 打赏
  • 举报
回复
试试这个

public void UpLoadFile(System.Web.HttpPostedFile postFile, string savePath)
{
try
{
if (!Directory.Exists(Path.GetDirectoryName(savePath)))
Directory.CreateDirectory(Path.GetDirectoryName(savePath));
using (FileStream fs = new FileStream(savePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
{
using (BinaryReader reader = new BinaryReader(postFile.InputStream))
{
int bufferLength = 0;
int readLength = 10240;
byte[] buffer = new byte[10240];
while (true)
{
bufferLength = reader.Read(buffer, 0, readLength);
if (bufferLength == 0) break;
fs.Write(buffer, 0, bufferLength);
}
}
}
}
catch (Exception ex)
{
throw new Exception(ex.Source + ex.Message);
}
}
telankes2000 2009-11-25
  • 打赏
  • 举报
回复
在上傳之前看看文件的大小
BinaryReader reader = new BinaryReader(postFile.InputStream)
if(reader.BaseStream.Length <0)
Response.Write("沒有可上傳的文件");
chichenzhe 2009-11-25
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 yuxuanji 的回复:]
也可能是服务器装了主动防护软件的原因
[/Quote]

唯独拦截了我某一个上传行为?其他的不拦截?
LutzMark 2009-11-25
  • 打赏
  • 举报
回复
也可能是服务器装了主动防护软件的原因
chichenzhe 2009-11-25
  • 打赏
  • 举报
回复
回19楼,硬盘空间还有很多.至少10G

回20楼代码:

<TD style="HEIGHT: 4px"><FONT face="宋体">
<asp:Panel id="m_plStart" runat="server" Width="100%">上传文件地址 <INPUT id="m_fileLocal" style="WIDTH: 520px; HEIGHT: 22px" type="file" size="67" name="File1"
runat="server"><FONT face="宋体">  </FONT><INPUT id="m_bttUpload" type="button" value="添加计划" name="btnUp" runat="server"></asp:Panel>修改项目</FONT>
<asp:Button id="m_buttEdit" runat="server" Text="确认修改" Visible="False"></asp:Button></TD>
</TR>


m_dateTask = Convert.ToDateTime(this.d1.Value + " " + m_ddListHour.SelectedValue + ":" + m_ddListMinute.SelectedValue + ":00");
strServerDirName = DateTime.Now.ToString("yyyyMMddhhmmss") + ".CardSend." + strTaskName + ".txt";

strLocalFile = System.IO.Path.GetFileName(m_fileLocal.PostedFile.FileName);
if (strLocalFile != "")
{
//文件绝对路径获取.
strServerDir = System.Web.HttpContext.Current.Request.MapPath("Text/") + strServerDirName;
m_fileLocal.PostedFile.SaveAs(strServerDir);
}
telankes2000 2009-11-25
  • 打赏
  • 举报
回复
多少KB的文件被上传了
这个在开始上传的时候就可以知道的
postFile.InputStream/1024
不知道楼主到底要干什么
chichenzhe 2009-11-25
  • 打赏
  • 举报
回复
我只想到了一个 缓解之计:

就是完成上传之后 给我返回一个状态,告诉我这次有多少KB的文件被上传了.

或者是我安排完成任务之后做一个检查,查看今天的任务里 各个任务的 TXT各是多少KB.

只能这样了...

求 查 D:\WEB\XX\XXX.TXT 文件大小的代码.比如查出来是200KB,那么就返回一个值给我.

C# WEB编程的方式.
telankes2000 2009-11-24
  • 打赏
  • 举报
回复
把上傳的代碼貼出來看下
  • 打赏
  • 举报
回复
硬盘空间满?
chichenzhe 2009-11-24
  • 打赏
  • 举报
回复
回楼上.因为0KB导致任务失败了.

所以我不得不今天补发. 但是今天却成功了. 太蹊跷了.
xiamiking 2009-11-24
  • 打赏
  • 举报
回复
会不会是编码不一样,导致从流里还原的时候出现了问题
xiamiking 2009-11-24
  • 打赏
  • 举报
回复
额,会不会是文件本身的问题
出现了这个问题以后上传都变成0KB了?
还是出现过一次之后,上传其他的文件又是正常的?

反复试过上传出问题的这个文件没有?全部都变成0kb,还是就那么一次?
chichenzhe 2009-11-24
  • 打赏
  • 举报
回复
http://www.tctl.com.cn/accp/1490/1493/163383.html

这位兄弟遭遇和我类似.不过他结贴的时候都没有一个确切的答案和一个令人信服的理由.而是不了了之了.
chichenzhe 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 luobingxka 的回复:]
你的操作系统是什么?如果是2003,建议看下c:\WINDOWS\system32\inetsrv\metabase.xml,查找此行AspMaxRequestEntityAllowed="204800",这里限制为200K,改下这个数值试试。改此文件需要停止IIS ADMIN SERVICE服务,改好保存后再启用IIS服务。
[/Quote]

谢谢你.
给你看个连接:http://www.2yup.com/asp/article/show.asp?pid=936

除了服务器配置,在asp.net中,web.config里设置的executionTimeout="90" maxRequestLength="409600"是可以取代你所说的方式的.

所以既然我做了WEB.CONFIG的设置就不需要再设置你这个.
而我现在使用了2个月仅仅发现这一次BUG.不得不怀疑是不是什么其他问题(比如有没可能我点了2次确认按钮导致上传失败?).但又实在没有招,不清楚到底什么情况下会发生这样头疼的BUG,怎么还原这个BUG
我只相信汗水 2009-11-24
  • 打赏
  • 举报
回复
你的操作系统是什么?如果是2003,建议看下c:\WINDOWS\system32\inetsrv\metabase.xml,查找此行AspMaxRequestEntityAllowed="204800",这里限制为200K,改下这个数值试试。改此文件需要停止IIS ADMIN SERVICE服务,改好保存后再启用IIS服务。
chichenzhe 2009-11-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wuyq11 的回复:]
文件什么格式,是否所有格式都这样
[/Quote]

只有txt格式. 并且昨天是200KB的文件失败了,成了0KB. 并且2个月使用以来第一次这样. 并且之前2-3M的文件都测试过.
加载更多回复(11)
控件UpdloadFile文件上传eg: string newfilename = file_uploadid.FileName; string size = file_uploadid.PostedFile.ContentLength.ToString(); string type = file_uploadid.PostedFile.ContentType; string type2 = newfilename.Substring(newfilename.LastIndexOf(".") + 1); string path = ""; try { if (file_uploadid.PostedFile != null && file_uploadid.PostedFile.FileName != "") { string hzm = System.IO.Path.GetExtension(file_uploadid.PostedFile.FileName);//后缀名 如 .doc string[] a = { ".txt", ".jpg", ".jpeg", ".gif", ".png", ".docx", ".doc", ".xlsx", ".xls", ".rar", ".zip", ".pdf" };//设定好了的格式 if (!a.Contains(hzm)) { Response.Write("文件格式不正确"); } else { int defaulsize = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["filesize"]);//取得设置的默认文件的大小 int filesize = (file_uploadid.PostedFile.ContentLength) / 1024; //取得上传的文件的大小,单位为bytes if (filesize < defaulsize) { #region 对文件进行操作 newfilename = DateTime.Now.ToString("yyyyMMddHHmmssfff") + hzm;//文件的新名字 如20120711105734222.doc path = System.Web.HttpContext.Current.Server.MapPath("~/UploadFile//");//文件保存的路径 if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } #endregion } else { //超过了文件的大小 Response.Write("上传的文件超过了3000M,请重新选择 "); } } } } catch (Exception) { Response.Write("文件格式不正确"); } #endregion if (newfilename != "") { file_uploadid.SaveAs(path + newfilename); //保存文件 }
aspx 文件 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <em>File</em>Upload上传<em>文件</em>示例-Mzwu.com
FileUpload ID="FileUpload1" runat="server" /> edevent="Button1_Click" Text="上传文件" OnClick="Button1_Click" />
cs文件 if (FileUpload1.HasFile) { try { FileUpload1.SaveAs(Server.MapPath("upload") + "\\" + FileUpload1.FileName); Label1.Text = "客户端路径:" + FileUpload1.PostedFile.FileName + "
" + "文件名:" + System.IO.Path.GetFileName(FileUpload1.FileName) + "
" + "文件扩展名:" + System.IO.Path.GetExtension(FileUpload1.FileName) + "
" + "文件大小:" + FileUpload1.PostedFile.ContentLength + " KB
" + "文件MIME类型:" + FileUpload1.PostedFile.ContentType + "
" + "保存路径:" + Server.MapPath("upload") + "\\" + FileUpload1.FileName; } catch (Exception ex) { Label1.Text = "发生错误:" + ex.Message.ToString(); } } else { Label1.Text = "没有选择要上传的文件!"; } }

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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