asp网站点击按钮下载文件服务器上的文件如何实现

yuyueshixian 2017-05-10 11:26:45
环境:公司内网。ASP网站使用iis架设在http://192.168.3.30:8060上,用户需要登陆网站后点击下载按钮下载\\10.100.10.100\company文件服务器上的文件aaa.zip。求下载文件按钮事件的写法?
本人刚接手此网站的维护,PC地址在192.168.3.150,使用visual Studio 2010进行编写。找到CSDN大神分享的下载方式,代码如下:
//WriteFile分块下载
protected void Button3_Click(object sender, EventArgs e)
{
string fileName = "aaa.zip";//客户端保存的文件名
string filePath = @“\\10.100.10.100\company”+ fileName;
//↑此处原作者使用的是Server.MapPath("DownLoadpath"),但是如果我这样写本地调试会认为路径不存在

System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);

if (fileInfo.Exists == true)
{
const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力
byte[] buffer = new byte[ChunkSize];

Response.Clear();
System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
long dataLengthToRead = iStream.Length;//获取下载的文件总大小
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
while (dataLengthToRead > 0 && Response.IsClientConnected)
{
int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
Response.OutputStream.Write(buffer, 0, lengthRead);
Response.Flush();
dataLengthToRead = dataLengthToRead - lengthRead;
}
Response.Close();
iStream.Close();
Response.End();
}
else 弹出窗口:文件不存在
}

本地调试时是可以打开浏览器自带下载器并正常完成下载,只是文件较大时下载过程中页面其他按钮点击没有反应,猜想是因为没有使用异步下载?(VS2010应该也不支持异步下载吧?)
调试完成后将网站发布到服务器,然后远程登陆网站并点击下载按钮却会提示文件不存在。我有远程连接到服务器电脑并直接在资源管理器输入\\10.100.10.100是可以打开路径的。不知道为什么发布到服务器上会提示文件不存在。

总结问题:
1.代码发布到服务器上为何就无法实现下载了?如何修改?
2.如果可以请告诉我如何解决下载过程中页面按钮点击没有反应?

...全文
561 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
初始归零 2019-03-28
  • 打赏
  • 举报
回复
请问博主做的是winfrom项目吗?
yuyueshixian 2017-05-22
  • 打赏
  • 举报
回复
谢谢各位,我添加了共享文件夹的用户认证语句解决了服务器无法下载的问题,在此结贴
夏天的枫 2017-05-22
  • 打赏
  • 举报
回复
同意楼上的说法。。。你想WannaCry么。。。
by_封爱 版主 2017-05-22
  • 打赏
  • 举报
回复
其实我也觉得 这个设计或者叫架构 本身出现了问题 而对于这种设计上的问题.我觉得不应该采用另类的代码或者其他方式来补偿.. 比如正常的方法会在有文件的服务器部署FTP或者自己写一个网页运行在IIS上面返回文件相关.. 而不是采用这种非常规的方式来解决问题.. 而且你采用共享的方式 就近期的那个勒索病毒来说...就专门找你这样的.....
zhujinqiang 2017-05-22
  • 打赏
  • 举报
回复
引用 3 楼 yuyueshixian 的回复:
谢谢各位,我添加了共享文件夹的用户认证语句解决了服务器无法下载的问题,在此结贴
继续使用共享文件夹的方式,可能给内网带来风险。 建议还是换成FTP服务器传文件吧
川娃子 2017-05-11
  • 打赏
  • 举报
回复
asp和asp.net是不同了,我就说这么现在还有人用asp public void Download(string fullPath, string clientFileName) { if (string.IsNullOrWhiteSpace(clientFileName)) { clientFileName = fullPath; } clientFileName = System.IO.Path.GetFileName(clientFileName); clientFileName = System.Web.HttpUtility.UrlEncode(clientFileName, System.Text.Encoding.UTF8); if (clientFileName != null) { clientFileName = clientFileName.Replace("+", "%20"); using (System.IO.Stream stream = new System.IO.FileStream(fullPath, System.IO.FileMode.Open)) { System.Web.HttpContext.Current.Response.Clear(); System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream"; System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + clientFileName); System.Web.HttpContext.Current.Response.AddHeader("Content-Length", stream.Length.ToString(CultureInfo.InvariantCulture)); int index = 0; int length = 2048; long dataLength = stream.Length; if (length > dataLength) length = (int)dataLength; byte[] data = new byte[length]; while (stream.Read(data, index, length) > 0) { System.Web.HttpContext.Current.Response.OutputStream.Write(data, index, length); System.Web.HttpContext.Current.Response.OutputStream.Flush(); dataLength -= length; if (length > dataLength) length = (int)dataLength; data = new byte[length]; } } } System.Web.HttpContext.Current.Response.End(); }
zhujinqiang 2017-05-10
  • 打赏
  • 举报
回复
path要用IIS的相对路径吧。

111,092

社区成员

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

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

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