You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 03:01:25