上传出现了部分错误,应该使用哪个HTTP状态码? 答案:应该使用HTTP状态码为 308(Resume Incomplete)

14

我正在开发一个REST API,并且需要进行一些文件上传

当文件仅被部分上传时,PHP 可以生成UPLOAD_ERR_PARTIAL错误,并且我不确定在这种情况下应该使用哪个HTTP状态码

如果用户取消上传(请参见为什么文件只能部分上传php.net上的文件上传错误),通常会发生这种情况。

如果在文件数据后未找到 MIME 边界,则会给出 UPLOAD_ERR_PARTIAL。可能的原因是用户取消了上传(按 ESC 等)。


如果文件只上传了一部分,它是否会执行您的 PHP 代码? - DevZer0
是的,问题在于当我检测到 PHP 错误时,我想要捕获它并将正确的 HTTP 状态码发送回用户。 - pconcepcion
我仍然不理解你的使用情况,唯一的可能性是浏览器故意发送部分数据。因为所有其他类型,如浏览器断开连接,你将无法提供反馈。 - DevZer0
@DevZer0 我已经更新了问题,如果用户取消上传,通常会发生这种情况。 - pconcepcion
1
你是否在考虑206,“部分内容”? - Lugubrious
7个回答

16

针对这种情况,您应该使用 409 状态码。

根据http://www.ietf.org/rfc/rfc2616.txt:

由于资源的当前状态与请求存在冲突,无法完成请求。只有在预期用户可能解决冲突并重新提交请求的情况下才允许使用此代码。响应正文应包含足够的信息,以便用户识别冲突的来源。理想情况下,响应实体将包含足够的信息,供用户或用户代理修复问题;但这可能是不可能的,并且不是必需的。


10
如果用户上传失败是因为他们正在上传的内容出现了问题,只需说:400 Bad Request

4

无需发送任何状态码,因为客户端已经断开连接。


1
这是正确的答案,在这种情况下,客户端将永远不会收到状态码,因此您可以只需执行 exit(); - Pierre

2

当文件数据后未找到mime边界时,会出现UPLOAD_ERR_PARTIAL错误。

需要长度411

该请求未指定其内容的长度,这是所请求资源所必需的。


2
我会选择使用422(由于语义错误无法跟随请求)或449(在执行操作后应重试请求)。请查看httpstatuses.com

1
我认为标题应该基于错误上下文:
如果文件上传类型不被允许:
HTTP_415 =“不支持的媒体类型”
如果文件上传过大:
HTTP_413 =“请求实体过大”
如果服务器在上传时出现问题:
HTTP_500 =“内部服务器错误”
如果上传超时:
HTTP_504 =“网关超时”
但总的来说,我会说500是相当标准的。

我知道所有这些并且已经处理了它们,我特别询问UPLOAD_ERR_PARTIAL的情况。 - pconcepcion
错误代码 415 并不是指上传的文件类型不被允许。它是在使用无效的 Content-Type 标头时出现的错误。此外,5xx 错误用于指示服务器端的错误 - 但这是客户端的问题。 - Zaffy

-1

我会使用

408 请求超时。 因为它表示请求仅被部分发送(在这种情况下不支持)。

400 错误请求 看起来是另一个选项。

您还可以使用非保留数字创建自己的选项。

但是,如果请求被取消,您将在哪里发送响应?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接