Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过HTTP上传大文件_Php_C++_Http_Upload - Fatal编程技术网

Php 通过HTTP上传大文件

Php 通过HTTP上传大文件,php,c++,http,upload,Php,C++,Http,Upload,我需要从桌面应用程序向服务器上传可能很大(比如10到100兆字节)的文件。服务器代码是用PHP编写的,PHP是用C++/MFC编写的桌面应用程序。我希望能够恢复文件上传时,上传失败的一半,因为这个软件将用于不可靠的连接。我有什么选择?我发现了一些C++的HTTP上传组件,比如看起来很好,但是它似乎没有处理“半个上传”的“简历”(我想这是因为HTTP 1.1不支持它)。我还介绍了BITS服务,但对于上传,它需要一个IIS服务器。到目前为止,我唯一的选择似乎是把我想上传的文件切成小块(比如说每个1兆

我需要从桌面应用程序向服务器上传可能很大(比如10到100兆字节)的文件。服务器代码是用PHP编写的,PHP是用C++/MFC编写的桌面应用程序。我希望能够恢复文件上传时,上传失败的一半,因为这个软件将用于不可靠的连接。我有什么选择?我发现了一些C++的HTTP上传组件,比如看起来很好,但是它似乎没有处理“半个上传”的“简历”(我想这是因为HTTP 1.1不支持它)。我还介绍了BITS服务,但对于上传,它需要一个IIS服务器。到目前为止,我唯一的选择似乎是把我想上传的文件切成小块(比如说每个1兆),全部上传到服务器上,用PHP重新组装,然后运行校验和,看看是否一切正常。要继续,我需要在上传开始时进行某种形式的“握手”,以确定哪些片段已经在服务器上。我是否需要手工编写代码,或者是否有人知道有一个库可以为我完成所有这些,或者甚至是一个完全不同的解决方案?出于维护原因(防火墙可能出现问题等),我不想切换到另一个支持本机恢复的协议。

是否可以选择反转整个过程?我的意思是,不要将文件推送到服务器,而是让服务器使用标准的HTTP GET和所有提示(如接受范围等)来拉取文件。

最简单的方法可能是创建一个上传页面,该页面将接受参数中的文件名和范围,例如和处理客户端中的简历(也许你可以添加一个函数来检查服务器接收到的范围)

你需要一个标准大小(比如256k)。如果你的文件“abc.txt”是由用户x上传的,它将是313个完整块和一个较小的块

  • 您发送一个上传请求,说明文件名、大小以及初始线程数
  • php代码将创建一个以IP地址和文件名命名的临时文件夹
  • 然后,您的应用程序可以使用多个连接在不同的线程中发送数据,因此您可以同时发送块1111212313(使用单独的校验和)
  • 您的php代码将它们保存到不同的文件中,并在验证校验和后确认接收,给出要发送的新块的编号,或使用此线程停止
  • 在所有线程完成后,您将要求php加入所有文件,如果缺少某些内容,它将转到3
  • 您可以随意增加或减少线程数,因为应用程序正在控制发送


    你可以很容易地显示一个进度指示器,或者是一个简单的进度条,或者是一个接近downthemall的区块详细视图的东西。

    我迟到了八个月,但我只是偶然发现了这个问题,并惊讶于没有提到webDAV。你可以使用HTTP PUT方法上传,并包括一个内容范围标头来处理resuming等等。HEAD请求会告诉您该文件是否已经存在,以及它有多大。因此,可能类似于以下内容:

    1) 头文件

    2) 如果它存在并且大小==本地大小,则已完成上载

    3) 如果大小<本地大小,则添加内容范围标头以请求并查找本地文件中的适当位置

    4) 发出PUT请求以上载文件(或部分文件,如果继续)

    5) 如果在PUT请求期间连接失败,请重新开始步骤1

    您还可以使用dav列出(PROPFIND)和重命名(MOVE)文件,以及创建目录(MKCOL)

    我相信Apache和Lighttpd都有dav扩展。

    libcurl(capi)可能是一个可行的选择

    -C/--继续在 以给定偏移量继续/恢复上一次文件传输。给定偏移量是将被跳过的确切字节数,从源文件的开头开始计算,然后再传输到目标文件。如果与上载一起使用,curl将不使用FTP服务器命令大小。 使用“-C-”告诉curl自动找出在哪里/如何恢复传输。然后它使用给定的输出/输入文件来解决这个问题。 如果多次使用此选项,将使用最后一个选项 哈哈,我也在想同样的事情——把整个事情颠倒过来,把服务器变成客户机,把客户机变成服务器。Thx对罗尔来说,为什么它不起作用,我现在更清楚了

    @罗尔
    我建议实现Java uploader[JumpLoader很好,它有JScript接口,甚至还有PHP服务器端的示例代码]。Flash上传程序在biiigggg文件方面遭受了巨大的损失:),其规模为千兆字节。

    谷歌已经创建了一个可恢复的HTTP上传协议。请参见

    F*EX可以通过HTTP上传最大TB范围的文件,并且能够在链接失败后恢复。 它不能完全满足您的需要,因为它是用Perl编写的,需要一个基于UNIX的服务器,但是客户端可以在任何操作系统上。尽管如此,这可能对您有所帮助:

    存在需要可恢复上传的协议,在和中有一些实现

    想法不错,但没有,因为客户端可能位于不允许传入web流量的公司防火墙后面,或者进行NAT,并且无法确定要转发到哪个客户端计算机。还有其他可能性吗?FTP,Bittorrent?很好的建议,不知道为什么我没想到。问题是,同时,令我非常遗憾的是,我实现了自己的解决方案:)结果是相当混乱,所以我可能最终会用WebDAV解决方案来取代它。谢谢。这取决于服务器。Apache(带有mod_dav)和其他成熟的服务器倾向于在PUT上支持内容范围。然而,S3并没有(尽管这似乎不是不可能的:)