FileUpload控件上传不支持给定路径的格式 问题解决

	    string filepath = Server.MapPath("~/upload");
            HttpFileCollection uploadFile = Request.Files;
            for (int i = 0; i < uploadFile.Count; i++)
            {
                HttpPostedFile userpostfile = uploadFile[i];
                if (userpostfile.ContentLength > 0)
                {
                    Label1.Text = "";
                    Label1.Text += "<u>文件#" + (i + 1) + "</u><br/>";
                    Label1.Text += "文件内容类型" + userpostfile.ContentType + "<br/>";
                    Label1.Text += "文件大小" + userpostfile.ContentLength + "<br/>";
                    Label1.Text += "文件名" + userpostfile.FileName + "<br/>";
                    userpostfile.SaveAs(filepath + "\\" + userpostfile.FileName); 
                }                
            }


页面上有多个(或者1个)FileUpload控件,一个Label标签和一个Button按钮,上面是按钮的单击事件的代码。

代码的作用就是遍历所有上传的文件,然后将其保存到服务器的网站下面的upload文件夹下面。有的童鞋选择好文件,点击按钮,会报错,提示“不支持给定路径的格式”,究其最本质的原因,是浏览器问题,如有童鞋使用的猎豹浏览器的兼容模式,或者360浏览器的兼容模式,或者其他浏览器的兼容模式,可以尝试更改为极速模式,再次执行程序,就不会报错了。
虽然最基本的问题解决了,但是这段代码中还有点问题需要提提。

注意最后一行代码,有些童鞋发现,在userpostfile后面敲“.”,无法出现PostFile属性,而我们的FileUpLoad控件是有这个属性的。

为什么没有呢?答案很简单,因为这两个压根不是一个东东(我刚开的时候只看最后一行代码,没看上面,也搞错了)

注意第4行代码

HttpPostedFile userpostfile=uploadFile[i]

这行代码的作用是将从客户端上传上来的文件转换成HttpPostedFile类型,而我们拥有PostFile属性的控件是FileUpload类型,两个压根就不是一个东西,当然没有这个属性了。下面是HttpPostedFile类的定义


HttpPostedFile userpostfile = uploadFile[i];

可以看到,其只有一个FileName只读属性,这个属性返回的是客户端上传文件的完全限定名称。比如你点击“浏览”按钮,然后再E盘下的Images文件下选择了一张名为jiqimao.jpg的文件,则FileNme属性的值就是E:\\images\\jiqimao.jpg,这个值是包含路径的,而不仅仅是jiqimao.jpg。

好,明白了这一点,也就明白为什么会报开始的那个错误“不支持给定路径的格式”。

注意按钮的单击事件中的最后一行

假如你选择的就是E:\\imgaes\jiqimao.jpg,则点击按钮上传到服务器后,通过FileName属性获取的就是E:\\images\\jiqimao.jpg,而前面的变量filepath的值为“E:\\class\\WebApplication4\\WebApplication4\\upload”(在我的机子上,在你们的机子上,路径可能不同),那么最后一行代码的计算结果就是将图片保存到下面路径

E:\\class\\WebApplication4\\WebApplication4\\upload\\E:\\images\jiqimao.jpg

显然这个路径压根就是不存在的,当然报错了。

但是同样的代码,有的童鞋就没报错,这是为什么呢?

这就是我们开始说的浏览器的问题

我们倒着我前推

可以肯定的是HttpPostedFile类的FileName属性获取的是从客户端上传的文件的完全路径,那么为什么有的人报错,有的人不报错?

因为有的人获取的FileName值为jiqimao.jpg,而有的人获取的是E:\\images\\jiqimao.jpg。

为什么同样的代码会获取不同的值呢?

因为你所使用的浏览器的问题,有的浏览器提交到服务器上的是jiqimao.jpg,而有的提交到服务器上的则是"E:\\images\jiqimao.jpg"

好了,到现在为止,原因找到了,但是怎么解决呢,难道我们要限制所有的用户都使用同一种浏览器或者同一种浏览模式吗?显然这是不现实的。

良好的解决方法是对FileName的值做一下处理,无论它是什么格式,我们只要文件名称,不要路径(哪怕它没有路径)

可以使用Path.GetFileName(HttpPostedFile.FileName)这种方式来处理,其返回值就是不包含路径的文件名称。

所以最开始的代码就改成下面这样子了(当然只改了最后一行代码)

string filepath = Server.MapPath("~/upload");
            HttpFileCollection uploadFile = Request.Files;
            for (int i = 0; i < uploadFile.Count; i++)
            {
                HttpPostedFile userpostfile = uploadFile[i];
                if (userpostfile.ContentLength > 0)
                {
                    Label1.Text = "";
                    Label1.Text += "<u>文件#" + (i + 1) + "</u><br/>";
                    Label1.Text += "文件内容类型" + userpostfile.ContentType + "<br/>";
                    Label1.Text += "文件大小" + userpostfile.ContentLength + "<br/>";
                    Label1.Text += "文件名" + userpostfile.FileName + "<br/>";
                    userpostfile.SaveAs(filepath + "\\" +Path.GetFileName( userpostfile.FileName)); 
                }                
            }


 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巴山却话

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值