【发布时间】:2012-10-19 02:44:18
【问题描述】:
我很难找到关于 AppEngine 的一个非常基本的问题的文档:
BlobStore 是否支持上传的分块传输编码?
我在 Java 中使用带有 setChunkedStreamingMode 的 HttpURLConnection 对象来上传多部分/表单数据类型请求中的文件,使用以下代码设置连接:
HttpURLConnection cxn = (HttpURLConnection) new URL(uploadUrl).openConnection();
cxn.setRequestMethod("POST");
cxn.setChunkedStreamingMode(9999);
cxn.setRequestProperty("Content-Type", "multipart/form-data; boundary=-");
cxn.setDoOutput(true);
cxn.connect();
开发服务器以状态 411 回答我的请求:需要长度。这是否意味着不支持分块传输模式,或者我是否错误地初始化了连接?生产服务器在这里的行为是否不同?这种行为是在生成上传 url 时指定最大上传大小的结果吗?
编辑:
如果我只是将cxn.setChunkedStreamingMode(9999); 行注释掉,一切正常,但我宁愿不这样做,因此我不必在发送请求之前在内存中缓冲数百 MB...
【问题讨论】:
-
生产服务器应该处理这个 - 你试过了吗?
-
如果您在生产环境中尝试这样做并且它正在返回该响应,我会说答案是否定的,它不支持它。但是,您不必缓冲整个文件 - 您只需要知道它的长度即可。
-
@NickJohnson 我实际上是在上传数据时即时压缩和加密数据,而我的处理功能只有几 MB/s 的吞吐量。这仍然比大多数人的上传快得多,所以如果我可以在数据可用时进行流式上传,处理根本不会导致任何减慢,但如果我需要提前做这一步,它会变得非常明显.不幸的是,由于我不知道我会得到多少压缩,所以我只有这两种选择(提前分块流式传输或完全处理以确定请求前的上传长度)。
-
@StuartLangley 刚刚读到您正在 AppEngine 团队工作,并感谢您参与了如此出色的产品!你知道是否有任何计划在开发服务器中实现分块传输?它将使使用此功能测试复杂代码(随着越来越多的 Android 应用程序使用 AppEngine,这可能会变得越来越频繁)变得更加容易。谢谢!
-
在问题跟踪器中提交功能请求将是添加此功能的方法,如果有足够多的人为它加注星标。
标签: java google-app-engine upload blobstore chunked-encoding