【问题标题】:Is there a way I continue on with a website while a file is being uploaded?有没有办法在上传文件时继续使用网站?
【发布时间】:2012-10-09 14:26:48
【问题描述】:

背景:

我正在为我的计算机系从事本科生研究项目。该项目是生物系的一个网站,一个关键的特点是生物学生可以上传他们自己的.xml文件,然后使用Matlab在服务器端为他们构建一个*模型。

前端位于 ASP.NET、javascript 和 C# 环境中。我与这个项目的一点关联是我对这些系统、工具和语言的所有了解。

问题:

我之前提到的.xml 文件可能需要数小时才能上传和构建。我的教授希望用户能够使用已经完成的模型继续页面,同时将新模型发送到后台,并且用户在完成时会收到一封电子邮件。我找到了发送电子邮件的材料,但没有找到继续页面的材料。

我听说过使用 AJAX 加载页面?

【问题讨论】:

  • 为了澄清,你说它“上传和构建可能需要几个小时”。我认为其中的上传部分非常快,构建需要很长时间?
  • 是的。现在它的设置方式会弹出一个小圆圈并在整个构建过程中旋转。

标签: c# asp.net ajax file-upload


【解决方案1】:

在您的页面上放置文件上传控件

<asp:FileUpload ID="FileUpload1" runat="server"/>

构建一个 http 处理程序来处理文件上传:

public class Handler : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        HttpPostedFile fileToUpload = context.Request.Files["Filedata"];
        string pathToSave = HttpContext.Current.Server.MapPath("~/Files/")
                            + fileToUpload.FileName;
        fileToUpload.SaveAs(pathToSave);

        //Process file
    }

    public bool IsReusable {
        get {
            return false;
        }
    }
}

看看你是否可以将像uploadify这样的上传插件集成到项目中(需要jQuery)。

<script type = "text/javascript">
$(document).ready(function()
{
     $("#<%=FileUpload1.ClientID %>").uploadify(
     {
       'swf': 'Scripts/uploadify.swf',
       'uploader': 'Handler.ashx',
       'auto': true,
      'buttonText': 'Select File(s)'
     });
});
</script> 

如果你不能做到这一点,你需要了解 ajax 是如何工作的

Ajax 通常使用 XMLHttpRequest,它不允许您对本地文件进行编码并将其发送到服务器。
您可以使用 Flash swf 来处理同一页面上的上传,或者使用具有不可见 1x1 iframe 目标的表单。

我在这个博客上找到了关于file uploads in asp.net的代码

【讨论】:

    【解决方案2】:

    我认为打开一个小的 i-frame,它实际上会进行上传,让您当前的页面继续工作。

    因此,在您当前的页面上,您要求提供文件位置和文件名等所有信息,然后在 i-frame 中打开一个新页面。让 i-frame 知道源文件/文件夹、目标文件/文件夹,并让它在后台工作。所以现在您的当前页面可以继续工作了。

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      使用无头 Java 上传小程序。 在 iFrame 中加载文件传输小程序,让用户启动文件传输,当用户想要浏览网站的其余部分时,不要重新加载包含 Java Applet 的 iFrame(它将上传文件)。传输完成后,调用 JAvaScript 关闭 iframe。

      以下示例使用 FileCatalyst 的 Java Applet,但该想法实际上适用于任何其他 Java FTP Applet 或 ActiveX

      <script>
          var browsePath = "";
      
          function browseAndAdd() {
            browsePath = document.FileCatalyst.browseLive(true);
         }
      
          function upload() {
          document.FileCatalyst.uploadLive();
         }
      
         function clearQueue() {
           document.FileCatalyst.clearQueue();
         }
       </script>
      
       <!--Uses onClick for demonstration only-->
       <form id="uploadform">
        <!--Launch a browse dialog and add the selected file to the queue-->
       <input type=button onClick="javascript:browseAndAdd();" value="Browse and Add to Queue" />
      
          <!-- Force upload of whatever is currently found in the transfer queue -->
          <input type=button onClick="javascript:upload();" value="Upload">
      
         <!-- Clear transfer queue (can be called only if no transfers are in progress) -->
          <input type=button onClick="javascript:clearQueue();" value="Clear Queue">
         </form>
      

      抱歉,没有缩进,我发现用于插入代码片段的 stackoverflow 标记对用户不太友好。

      【讨论】:

        【解决方案4】:

        理想情况下,您需要设置某种异步处理。就我个人而言,我喜欢使用 Celery 和 RabbitMQ 进行异步和消息传递。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-02-09
          • 2020-06-03
          • 2023-03-09
          • 1970-01-01
          • 1970-01-01
          • 2021-08-21
          • 2011-05-04
          • 1970-01-01
          相关资源
          最近更新 更多