我需要从桌面应用程序向服务器上传潜在的大文件(如10英寸到100英镑)。服务器代码是用PHP编写的,桌面应用程序是用C ++ / MFC编写的。我希望能够在上传失败一半时恢复文件上传,因为该软件将用于不可靠的连接。我有什么选择?我发现了许多用于C ++的HTTP上传组件,例如http://www.chilkatsoft.com/refdoc/vcCkUploadRef.html看起来很棒,但它似乎没有处理半完成上传的“恢复”(我认为这是因为HTTP 1.1没有支持它)。我也看了BITS服务但是对于上传它需要一个IIS服务器。到目前为止,我唯一的选择似乎是将我想要上传的文件切换成较小的部分(比如每个1兆),将它们全部上传到服务器,用PHP重新组装它们并运行校验和以查看是否一切正常。要恢复,我需要在上传开始时进行某种形式的“握手”,以找出服务器上已有的部分。我是否需要手动编写代码或者是否有人知道为我做这一切的库,或者甚至是完全不同的解决方案?由于维护原因(防火墙的潜在问题等),我宁愿不切换到另一种本地支持恢复的协议。
答案 0 :(得分:20)
我迟到了八个月,但我偶然发现了这个问题,并且很惊讶没有提到webDAV。您可以使用HTTP PUT方法上传,并包含一个Content-Range标头来处理恢复等。 HEAD请求会告诉您文件是否已存在以及文件有多大。所以也许是这样的:
1)HEAD远程文件
2)如果它存在并且size == local size,则上传已经完成
3)如果尺寸<1。在本地大小,添加一个Content-Range标头来请求并寻找本地文件中的适当位置。
4)让PUT请求上传文件(或文件的一部分,如果恢复)
5)如果在PUT请求期间连接失败,请从步骤1重新开始
您还可以列出(PROPFIND)和重命名(MOVE)文件,并使用dav创建目录(MKCOL)。
我相信Apache和Lighttpd都有dav扩展。
答案 1 :(得分:2)
您需要标准尺寸(比如256k)。如果用户x上传的文件“abc.txt”为78.3MB,那么它将是313个完整的块和一个较小的块。
您可以随意增加或减少线程数,因为应用正在控制发送。
您可以轻松地显示进度指示器,可以是简单的进度条,也可以是接近downthemall的详细块视图。
答案 2 :(得分:2)
libcurl(C api)可能是一个可行的选择
-C / - 继续 - 在 继续/恢复给定偏移量的先前文件传输。给定的偏移量是将被跳过的确切字节数,从源文件的开头开始计算,然后再传输到目标。如果与上载一起使用,curl将不使用FTP服务器命令SIZE。 使用“-C - ”告诉curl自动找出恢复传输的位置/方式。然后它使用给定的输出/输入文件来计算出来。 如果多次使用此选项,则将使用最后一个选项
答案 3 :(得分:1)
Google已经创建了可恢复的HTTP上传协议。见https://developers.google.com/gdata/docs/resumable_upload
答案 4 :(得分:0)
是否可以选择整个过程?我的意思是,不是将文件推送到服务器,而是让服务器使用带有所有铃声和口哨的标准HTTP GET(如接受范围等)来拉取文件。
答案 5 :(得分:0)
也许最简单的方法是创建一个上传页面,接受参数中的文件名和范围,例如http://yourpage/.../upload.php?file=myfile&from=123456并处理客户端中的简历(也许你可以添加一个函数来检查服务器的范围已收到)
答案 6 :(得分:0)
@Anton Gogolev 大声笑,我只是想着同样的事情 - 扭转整个事物,使服务器成为客户端,客户端成为服务器。对Roel来说,为什么它不起作用,现在对我来说更清楚了。
@ Roel 我建议实现Java uploader [JumpLoader是好的,它的JScript接口甚至样本PHP服务器端代码]。当涉及到BIIIGGG文件时,Flash上传器遭受了严重的损失:),这是一个千兆字节的规模。
答案 7 :(得分:0)
F * EX可以通过HTTP上传最高TB范围的文件,并且能够在链接失败后恢复。 它不能完全满足您的需求,因为它是用Perl编写的,需要基于UNIX的服务器,但客户端可以在任何操作系统上。也许它对你有帮助: http://fex.rus.uni-stuttgart.de/
答案 8 :(得分:0)