【问题标题】:AjaxFileUpload reloads page on upload ONLY for image filesAjaxFileUpload 仅在上传图像文件时重新加载页面
【发布时间】:2021-12-11 01:34:54
【问题描述】:

我一直在努力调试我在使用 AJAXFileUpload 时遇到的间歇性问题。我正在将我们的代码从另一个上传者那里移开,并且已经将它处理成几个页面。我已经意识到上传者在完成仅用于图像的代码隐藏中的 UploadComplete 代码后重新加载页面。我可以毫无问题地上传 .pdf、.docx,但只要我尝试 .png、.jpeg、.gif 等,页面就会在上传后立即重新加载。

我找不到任何表明这两种文件之间的行为应该不同的东西,我假设我遗漏了一些东西。

这是我的上传控件:

<ajax:AjaxFileUpload AutoStartUpload="true" OnClientUploadCompleteAll="() => $('#btnSaveThumbnails').toggle()" ClientIDMode="Static" style="max-width:800px;display:none" runat="server" ID="thumbUploader" />

这里是 UploadComplete 函数的代码隐藏:

If Not System.IO.Directory.Exists(tempFilePath) Then
            System.IO.Directory.CreateDirectory(tempFilePath)
        End If

        sender.SaveAs(tempFilePath & e.FileName)

        Session("docUploaderFiles") = If(Session("docUploaderFiles"), New List(Of String))
        CType(Session("docUploaderFiles"), List(Of String)).Add(e.FileName)

正如我所提到的,根据我的经验,这些对于非图像文件类型的工作方式完全符合预期。

更新:我已将其缩小为由代码隐藏中的 .SaveAs 调用引起的。仅删除该行不会导致页面重新加载。

更新:我发现这个问题是我的机器特有的。上传器适用于其他本地环境以及我们的生产应用程序。可能与我的 IIS 有关。

【问题讨论】:

  • 当您的 btnSaveThumbs 发生“全部完成”事件时,您使用按钮单击/切换,我怀疑当所有文件完成后会导致最终回发。所以看起来你最后的“全部”事件做了一个回发(这通常是需要的)。所以从我目前所见,上传每个文件事件不会导致回发,但最终的上传“全部”完成事件是(正如我所指出的,这是一个常见的设置)。所以,我会检查所有完成的事件代码——因为它看起来像是回发的来源。所以每个文件事件都会触发,然后最终的“所有事件”会为最终事件触发,回发应该无关紧要
  • @AlbertD.Kallal 它实际上是导致整个页面加载而不是回发,正如我在调试中的一些断点所证实的那样。对我来说最大的谜团是,这种行为不存在于 .doc、.pdf、.xlsx(我敢肯定其他扩展名),但仅适用于图像文件(.png、.jpeg、.gif 测试)。跨度>
  • 将 png、jpeg 等放入允许的文件类型中。可能是页面/脚本错误?同意这没有意义。上传后是否显示缩略图或有关该文件的其他内容?或者只是文件被上传?我经常使用该控件-甚至对其进行了修改以允许为每个事件传递值(因此我不必使用会话)。那么,在最后的“all”活动中有特价代码吗?
  • 感谢您的回复。我之前尝试过允许的文件类型,但现在又一次没有成功。在我的 JS 控制台中看不到任何内容。我没有对页面上的图像做任何其他事情。没有前端或后端“所有”事件。我也在具有相同体验的多个页面上使用相同的实现。
  • 我会创建一个测试页面并放入文件上传器。如果必须,硬编码另存为文件名 - 但请尝试测试页面并查看是否发生这种情况。请记住,如果 3 个服务器端事件中的任何一个有错误 - 那么这也可能是问题所在。所以,我会建立一个快速测试页面——看看它是否有效。我会自己尝试一个测试页面,因为我只上传过 pdf 和 zip 文件。但我无法想象为什么 png/jpeg 会成为问题?也许您在该站点上有一个用于 jpeg 文件的自定义 http 处理程序 - 但即便如此,这也不重要。

标签: asp.net vb.net ajaxcontroltoolkit


【解决方案1】:

我不明白为什么这不起作用。

但是,我经常发现,如果您不指定并连接 CLIENT 附带事件,那么上传者可能会向您吐槽。

所以,试试这个进行测试:

        <ajaxToolkit:AjaxFileUpload ID="AjaxFileUpload1" runat="server" 
            OnClientUploadComplete="MyComplete" 
            OnClientUploadCompleteAll="MyCompleteAll" 
            OnClientUploadStart="MyStart" AllowedFileTypes="txt,zip,png,jpeg"
            OnClientUploadError="MyError" ChunkSize="16384" />

        </div>
        <br />
        <br />
    </div>

    <script>

        function MyStart() {

        }

        function MyComplete() {

        }

        function MyCompleteAll() {

        }

        function MyError(e) {
        }


    </script>

请注意我是如何添加客户端事件的。我发现在某些情况下,如果没有客户端事件,就会出现问题,所以我删除了 4 个空白客户端事件。

即使您不使用客户端事件,也请尝试按照上述方式将它们放入。所以,我加入了 4 个客户端事件——这些存根中没有任何代码。

我的这个测试的服务器端代码是这样的:

Protected Sub AjaxFileUpload1_UploadCompleteAll(sender As Object, e As AjaxControlToolkit.AjaxFileUploadCompleteAllEventArgs) Handles AjaxFileUpload1.UploadCompleteAll

    Debug.Print("all done")

End Sub

Protected Sub AjaxFileUpload1_UploadStart(sender As Object, e As AjaxControlToolkit.AjaxFileUploadStartEventArgs) Handles AjaxFileUpload1.UploadStart

    Debug.Print("start upload")

End Sub

Protected Sub AjaxFileUpload1_UploadComplete(sender As Object, e As AjaxControlToolkit.AjaxFileUploadEventArgs) Handles AjaxFileUpload1.UploadComplete

    Debug.Print("file done")

    Debug.Print(e.FileName)

End Sub

Protected Sub AsyncFileUpload1_UploadedFileError(sender As Object, e As AjaxControlToolkit.AsyncFileUploadEventArgs)

    Debug.Print(e.StatusMessage)


End Sub

我还会检查 + 清除文件名中的非 ASCII 字符。我看到了一些有趣的文件——它们报错了。

所以,我这样做:

    Dim strCleanFile As String = TrimNonAscii(e.FileName)

Public Function TrimNonAscii(ByVal value As String) As String

    Dim pattern As String = "[^ -~]+"
    Dim reg_exp As Regex = New Regex(pattern)
    Return reg_exp.Replace(value, "")

End Function

所以我删除了空格,也删除了其他有趣的值。 (在 Mac 或其他设备上,它们实际上允许文件名中包含非合法的 windows 字符,但 windows 不允许。

【讨论】:

  • 使用您提供的确切代码,我没有重新加载页面。这让我尝试了没有服务器端代码的原始上传器,效果也很好。这让我相信服务器端代码导致了这个问题,但这一切都很简单,我无法想象为什么图像的行为会与其他文件类型不同。
  • 如果服务器端代码出现错误,那么事情就会变得很糟糕。也许测试文件已打开/锁定/未发布。尝试不同的 png 文件。我有上面的服务器端代码线,并将发布我的服务器端代码。
  • 我推断是 sender.SaveAs() 调用导致页面重新加载。但是,它不会引发任何错误。另一个注意事项是 SaveAs() 调用实际上是在保存图像。
  • 尝试 4 个服务器端代码存根。并确保 4 个客户端存根存在。如果所有事件都触发,那么您会发生一些服务器端错误 - 路径名或某个锁定的文件。在测试页面中转储文件保存代码 - 确保触发所有事件。如前所述,已经有一段时间了,但我似乎记得如果所有 4 个客户端事件 js 存根都不存在,那么就会出现问题 - 所以我把它们放进去,即使不需要也不需要使用。还要检查 t
  • 不要使用发件人。使用 AjaxFileUpload1.SaveAs()
猜你喜欢
  • 2019-01-31
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2015-02-09
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
相关资源
最近更新 更多