【问题标题】:ASP.net file operations delayASP.net 文件操作延迟
【发布时间】:2010-01-07 16:29:00
【问题描述】:

好的,问题来了:我正在从 FileUpload 控件读取流,读取 n 字节的块并在循环中写入数组,直到到达流的末尾。

现在我这样做的原因是因为我需要在上传仍在进行时检查几件事情(而不是执行 Save(); 一次完成整个事情)。这就是问题所在:在本地机器上执行此操作时,我可以看到文件很好,因为它正在上传并且它的大小增加(必须在循环中添加一个 Sleep(); 子句才能真正看到正在写入的文件)。

但是,当我从远程计算机上传文件时,在文件完成上传之前我看不到它。此外,随着进度的进行,我添加了另一个调用以将进度写入文本文件,我得到了同样的结果。本地:文件随着上传的进行而更新,远程:令牌文件仅在上传完成后出现(这有点没用,因为我在上传仍在进行时需要它)。

在(或 ASP.net)中是否有某种安全设置可以将文件保存在远程机器的临时位置而不是本地机器,然后将它们移动到指定的目标?我会将其与 ASP.net 相比,在从本地计算机(甚至在公共主机名上)浏览时显示错误消息,而不是从远程计算机浏览时显示的通用编译错误页面/通用异常页面(并且 customErrors 不是关闭)

这有什么线索吗?

提前致谢。

【问题讨论】:

    标签: asp.net file io operations


    【解决方案1】:

    FileUpload 控件呈现为<input type="file"> HTML 元素;这样,您的浏览器将打开该文件、读取所有内容、编码并发送。

    您的 ASP.NET 请求在 IIS 接收到所有浏览器数据后才开始。

    这样,您需要编写一个客户端组件(Flash、Java 小程序、Silverlight)来以小块的形式发送文件并在服务器端重建该文件。

    编辑:一些信息on MSDN

    要在处理请求时控制要上传的文件是临时存储在内存中还是服务器上,请设置 httpRuntime 元素的 requestLengthDiskThreshold 属性。此属性使您能够管理输入流缓冲区的大小。默认值为 256 字节。您指定的值不应超过您为 maxRequestLength 属性指定的值。

    【讨论】:

    • 所以你的意思是,即使我在本地机器测试中存在延迟,内容已经完全到达 IIS,我只是在内部处理已经到达的东西。基本上我想要做的是一个服务器/客户端上传进度指示器(它将使用一些客户端javascript轮询服务器上的另一个页面以获取进度)。谢谢。此外,如果默认值已经是 256 字节(并且我们假设每 256 字节数据写入磁盘一次),这意味着这将不起作用:( 感谢您的回复。
    • 老实说,requestLengthDiskThreshold 属性我也没看懂;但要创建上传进度,您必须以块的形式发送数据
    • 这个 jQuery 库让我特别感兴趣并决定尝试 Web 方法。 t.wits.sg/misc/jQueryProgressBar/demo.php我正在尝试上传,它似乎适用于 PHP。
    【解决方案2】:

    我了解到您想检查正在上传的文件的内容。 如果这是您的要求,那么为什么不添加一个文本框并在您从 HttpPostedFile 读取文件时填充它。

    【讨论】:

    • 主要问题是触发器不会激活,直到请求的全部内容被发送(在这种特殊情况下是整个文件)。我试图做的是访问仍在服务器上下载的文件数据。
    猜你喜欢
    • 2013-01-10
    • 2014-05-08
    • 2016-04-04
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2013-02-22
    相关资源
    最近更新 更多