ASP.NET(VB)使用CodeFile无命名空间时图片重复上传问题
ASP.NET WebForm CodeFile模式下动态文件名触发文件重复上传问题
发布到Web服务器的页面采用CodeFile模式,因添加CodeFile后保留命名空间会报错,故移除了命名空间。
新建Web项目即可稳定复现该异常,可参考演示视频查看问题直观表现。
两套代码逻辑完全一致,仅Page指令的CodeBehind/CodeFile配置、命名空间引用存在差异,文件上传表现完全不同。
异常表现对比
- 使用带命名空间的CodeBehind配置时,按日期重命名的图片可正常单文件上传,对应Page指令配置:
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Test.aspx.vb" Inherits="ImageServer.Test" %>
- 使用无命名空间的CodeFile配置时,按日期重命名的图片会出现重复上传,对应Page指令配置:
<%@ Page Language="vb" AutoEventWireup="false" CodeFile="Test.aspx.vb" Inherits="Test" %>
不同文件名生成逻辑的表现差异
- 若使用文件原始名称保存上传文件,无论采用哪种Inherits配置,都只会上传单份文件,对应代码:
Dim fileName As String = IO.Path.GetFileName(postedFile.FileName) postedFile.SaveAs(Server.MapPath("~/Uploads/") & fileName)
- 若使用拼接时间的动态文件名,CodeFile+无命名空间模式下就会出现重复上传,对应代码:
Dim getYear As String = (((((now.ToString("hh") & "") + now.ToString("mm") & "") + now.ToString("ss") & "") + now.ToString("mm") & "") + now.ToString("dd") & "") + now.ToString("yyyy") + now.ToString("fff") + "" Dim testName As String = getYear + ext postedFile.SaveAs(Server.MapPath("~/Uploads/") & testName)
可复现问题完整代码
可切换Page指令的注释进行对比测试。
Test.aspx 前端代码
<%'@ Page Language="vb" AutoEventWireup="false" CodeBehind="Test.aspx.vb" Inherits="ImageServer.Test" %> <!--Singles--> <%@ Page Language="vb" AutoEventWireup="false" CodeFile="Test.aspx.vb" Inherits="Test"%> <!--Duplicates--> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script language="javascript" type="text/javascript"> $(function () { $("[id*=fuUpload]").change(function () { if (typeof (FileReader) !="undefined") { var dvPreview = $("#dvPreview"); dvPreview.html(""); var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.jpg|.jpeg|.gif|.png|.bmp)$/; $($(this)[0].files).each(function () { var file = $(this); if (regex.test(file[0].name.toLowerCase())) { var reader =new FileReader(); reader.onload = function (e) { var img = $("<img />"); img.attr("style","height:100px;width: 100px"); img.attr("src", e.target.result); dvPreview.append(img); } reader.readAsDataURL(file[0]); }else { alert(file[0].name +" is not a valid image file."); dvPreview.html(""); return false; } }); }else { alert("This browser does not support HTML5 FileReader."); } }); }); </script> </head> <body> <form runat="server"> <asp:FileUpload ID="fuUpload" runat="server" multiple="multiple" /> <asp:Button ID="btnUpload" Text="Upload" runat="server" OnClick="Upload" /> <hr /> <div id="dvPreview"> </div> </form> </body> </html>
Test.aspx.vb 后端代码(上传按钮点击事件逻辑)
For i As Integer = 0 To Request.Files.Count - 1 Dim postedFile As HttpPostedFile = Request.Files(i) Dim ext As String = System.IO.Path.GetExtension(postedFile.FileName) Dim now As DateTime = DateTime.Now Dim getYear As String = (((((now.ToString("hh") & "") + now.ToString("mm") & "") + now.ToString("ss") & "") + now.ToString("mm") & "") + now.ToString("dd") & "") + now.ToString("yyyy") + now.ToString("fff") + "" Dim testName As String = getYear + ext If postedFile.ContentLength > 0 Then Dim fileName As String = IO.Path.GetFileName(postedFile.FileName) postedFile.SaveAs(Server.MapPath("~/Uploads/") & fileName) ' 任意模式下均单文件上传 'postedFile.SaveAs(Server.MapPath("~/Uploads/") & testName) ' CodeFile无命名空间模式下重复上传 End If Next
最新排查进展
经测试,动态文件名生成逻辑是触发问题的直接条件:
- 文件名拼接毫秒标识
now.ToString("fff")、使用Guid.NewGuid().ToString()、Path.GetRandomFileName()生成随机动态文件名时,都会触发重复上传 - 该异常仅在CodeFile模式下出现,CodeBehind模式下使用动态文件名完全正常
目前暂未明确CodeFile模式下动态文件名触发重复上传的根本原因。
内容的提问来源于stack exchange,提问作者CodingEE
相关产品推荐
相关产品推荐

