【问题标题】:Large file upload though html form (more than 2 GB)通过 html 表单上传大文件(超过 2 GB)
【发布时间】:2011-06-30 12:16:27
【问题描述】:

是否有上传超过 2 GB 的文件,使用简单的 html 表单上传?以前我一直在使用分块通过silverlight上传大文件(将大文件分成段,然后逐段上传,然后在服务器上重新组装段)。

现在,我们有一个要求,我们只需要使用简单的 html(虽然是 GWT)表单上传。请问有什么办法可以通过这种方式实现大文件上传。

如果使用简单的 html 无法做到这一点,谁能指导我如何使用 flex 分段和上传文件?

【问题讨论】:

    标签: html http file-upload large-files


    【解决方案1】:

    HTTP POST 请求大小的限制通常根本不在 HTML 端。限制更多的是在服务器端。需要将网络服务器配置为接受大型 POST 请求。默认值通常通常是 2GB,服务器通常会返回 HTTP 500 错误。默认限制通常可以增加到 4GB,但超出此范围的任何内容都会触及 32 位系统的边界。在具有 64 位操作系统的 64 位系统上,理论边界要高得多,为 16EB。

    如果配置网络服务器以接受大型 POST 请求不是一个选项,或者当您想要超出网络服务器的限制时,那么您别无选择,只能在客户端拆分文件并在服务器中重新组装部件一边。

    由于 HTML 只是一种标记语言,它不提供分割文件的功能。您确实必须使用像 C# (Silverlight) 或 Java (Applet) 这样的普通编程语言来代替您通过网页提供服务的小型应用程序。很可能使用 Flash 或 Flex 也可以,但不要把我钉在上面,因为我两者都没有。

    也就是说,对于通过网络传输(大)文件,FTP 是比 HTTP 更好的选择。我会重新考虑使用 HTTP 的选择。

    【讨论】:

    • 感谢 BalusC,我们可以将服务器限制增加到 4GB,但 IE 和 FF 不支持发送大于 2GB 的文件。我会在上传之前寻找 flash / flex 来破坏文件或压缩它。谢谢,纳迪姆
    • 那么你真的必须编写一个完成这项工作的应用程序。 HTML 是一种标记语言,而不是一种编程语言。如果网络服务器的限制是 4GB,那么您可以在应用程序中做到这一点,而无需拆分。顺便说一句,我不会压缩它,这只是不必要的开销,最终可能会在二进制文件上节省很少甚至没有。
    • @BalusC,你的意思是浏览器没有限制吗?并且有了强大的服务器(读取删除),我们可以upload TB range 文件?
    • 非常奇怪的限制,因为像 webpieces 这样的服务器可以以 5k 块的形式“流式传输”文件,以免在大文件进入时将 RAM 写入某些后端云存储或诸如此类的东西。这一定是遗留的网络服务器什么的。
    • @Pacerier 天空是极限,除非在某些时候,用硬盘坐飞机可能会更快(我们实际上曾经发生过这种情况......只需计算尺寸和多长时间)。此外,您必须担心断开连接时该怎么做。浏览器可能会重新开始,这可能非常非常糟糕。我希望 html 5 有一个解决方案,这些天不要从头开始处理大文件。
    【解决方案2】:

    使用 HTML5 File API 上传大文件。有切片的概念,可以上传大文件。

    var reader= new FileReader();
    reader.onload=function(e){
    
    //do whatever you want with result
    }
    var blob = file.slice(startingByte, endindByte);//slicing file
    reader.readAsBinaryString(blob);
    

    FileSystem Tutorial

    File API tutorial

    【讨论】:

    • 这个解决方案的文件大小限制是多少?
    • 您使用的是哪个浏览器?超过 8 GB 的蓝光视频文件呢?
    • 我还没测试到那个水平,我给你做个demo,你可以测试一下。
    • 看起来像相关的API died,不再被 W3C 考虑。
    • 据我所知,FileReaderApi 根本没有死。所有现代浏览器都支持它!理论上没有大小限制,因为该解决方案适用于块。
    【解决方案3】:

    我们创建了一个 web 应用程序 (https)(使用 django/python),它将批量文件上传到 sqlserver 数据库。为此,我们以块的形式读取文件,通过 sftp 传输到服务器,并对 sqlserver 执行批量插入。我们针对 1 GB 的文件大小对其进行了基准测试,并在大约 1 分钟左右的时间内结束了进程。

    【讨论】:

    • 这是一个非常有趣的解决方案,包括 sFtp
    猜你喜欢
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2014-12-03
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多