Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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
HTTP部分上载、恢复上载的标准方法_Http_Upload - Fatal编程技术网

HTTP部分上载、恢复上载的标准方法

HTTP部分上载、恢复上载的标准方法,http,upload,Http,Upload,我正在开发http客户机/服务器框架,并寻找处理部分上载的正确方法(与使用带有范围标头的GET方法进行下载相同) 但是,HTTP PUT不打算恢复。 正如我所知,补丁方法不接受范围标头 有没有办法通过HTTP标准(不使用扩展头等)来处理这个问题 提前感谢。我认为部分上传没有标准: 请求内的内容范围在(http)中没有明确禁止,但该措辞也将其称为响应头,用于响应范围请求 虽然您可以使用补丁方法更新现有资源(例如添加更多字节),但这与部分上载不同,因为不完整的资源始终可用 如果你看一下Dropb

我正在开发http客户机/服务器框架,并寻找处理部分上载的正确方法(与使用带有范围标头的GET方法进行下载相同)

但是,HTTP PUT不打算恢复。 正如我所知,补丁方法不接受范围标头

有没有办法通过HTTP标准(不使用扩展头等)来处理这个问题


提前感谢。

我认为部分上传没有标准:

  • 请求内的内容范围在(http)中没有明确禁止,但该措辞也将其称为响应头,用于响应范围请求
  • 虽然您可以使用补丁方法更新现有资源(例如添加更多字节),但这与部分上载不同,因为不完整的资源始终可用
如果你看一下Dropbox、google drive等的协议,它们都会使用自己的协议在多个块中传输单个文件。可恢复上传所需的是

  • 一种解决不完整上传的方法。正常的URL地址是一个完整的,而不是一个部分资源,我知道没有部分资源的标准
  • 找到上传当前状态的一种方法,也可以检查部件的总和,以确保本地文件没有更改。这可以由WebDAV PROPFIND方法提供(一旦您能够解决不完整的资源:)
  • 一种上传区块的方法。在这里,可以使用带有内容范围标题的补丁。mod_dav似乎允许使用内容范围标题进行PUT(请参阅)
  • 一种在资源完成后发布它的方法,或者一种预先定义完成意味着什么的方法(例如资源大小、校验和…)

正如一些评论中所指出的,较新版本的HTTP规范在某种程度上澄清了这一点。Per:

允许放置给定目标资源的源服务器必须发送 对包含 内容范围标头字段(),自有效负载 很可能是被错误地当作完整内容的部分内容 代表性。部分内容更新可以通过针对 单独标识的资源,其状态与 更大的资源,或通过使用已明确指定的不同方法 为部分更新定义(例如,中定义的修补程序方法 )

不幸的是,对中出现的范围头的讨论或多或少地完全集中在GET请求上,RFC 5789几乎没有定义任何关于修补程序的内容,只是它不需要传输整个内容(但允许),也不需要幂等(但允许)

好的一面是,因为补丁的定义非常松散,所以它确实适应了一个相关问题的答案()中给出的方法:只需将“PUT”更改为“PATCH”。虽然不要求服务器以这种方式解释带有内容范围标头的修补程序请求,但它肯定是一种有效的解释,只是不能从任意服务器或客户端依赖。但在像原始问题这样的情况下,如果两端都可以控制,这至少是一种明显的方法,并不违反当前的标准


另一个需要考虑的问题是,内容类型应该表示正在传输的内容,而不是实体作为一个整体的内容类型(RFC在这方面给出了一些示例)。对于以任意块“修补”的内容,这意味着应用程序/八位字节流,尽管在某些情况下,客户端和服务器可能更了解内容,并选择将修补程序作为具有更具体定义的实体发送(例如,多页图像格式的单页).

使用范围xxxx-yyy标头或范围xxxx-header和PUT更新文件的一部分。它由Apache支持


不要被RFC 7231中不能使用内容范围的语句所迷惑。这是为了防止客户端从服务器接收头并使用PUT将其发送回服务器,从而造成不良后果。此注意事项与partials put问题无关。

对于可恢复上载,补丁是一种合理的选择方法:它需要一种指示如何更改目标资源的媒体类型。虽然没有明确定义为执行修补的格式,但指定了字节范围和该范围的内容,使其适合于为修补有效负载定义

例如:

PATCH /document HTTP/1.1
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES

--THIS_STRING_SEPARATES
Content-Type: text/plain
Content-Range: bytes 10-21/22

1234567890
--THIS_STRING_SEPARATES--

本例以10字节的偏移量上载12个字节
此字符串是用户选择的任意分隔符,应随机生成。为了简洁起见,省略了一些标题,每行都以␍␊.

请参阅中@btimby的答案。感谢您的评论。我看到了关于差异的问题和答案。但是,对于部分PUT还不清楚,因为一些RFC说带有PUT的内容范围标头是不可接受的。关于补丁方法,我没有看到任何关于使用Content Range的信息。规范没有禁止它,但是你必须查阅服务器手册,了解它是否实现了它。您可能需要根据服务器软件和版本编写自定义代码或配置。我正在从头编写http客户端和服务器。当然,我可以使用一些非标准的扩展,但是如果有一种标准的方法,那么最好使用它。然后解释一下你想做什么。如果你想让你的客户机支持它,你必须知道服务器是如何实现它的。您的实际问题是“如何使用
内容范围
标题检测HTTP服务器支持部分上传”?如果您希望您的服务器支持它,只需实现它。HTTP规范现在不幸地禁止显式地为PUT请求使用Contant Range头,这将是最简单的