我想将 400MB 的文件上传到 Google Cloud Storage。以下是我用来获取上传网址并在 angularjs 中发布的代码片段
Java Servlet:
UploadOptions opts = UploadOptions.Builder
.withGoogleStorageBucketName(GCS_BUCKET_NAME);
String url = blobstore.createUploadUrl("/upload", opts);
AngularJS:
$scope.formData.append('file', $scope.filename);
$http.post(uploadUrl, $scope.formData, {
withCredentials: true,
headers: {
'Content-Type': undefined
},
transformRequest: angular.identity
})
代码工作正常,直到文件大小约为 100-150MB,当文件大小更大时,我在浏览器控制台中收到以下错误。
无法加载资源:服务器响应状态为 500(Java 堆空间)
我需要做什么才能避免此错误?
最佳答案
正如您在回答我上面的问题时所说,这仅发生在开发中,而不是生产中。我的猜测是,谷歌的 blobstore 代码将整个请求读取到其开发服务器的内存中,但这很难说,因为我们无权访问该代码。如果您需要在开发中测试更大的上传,您可以尝试配置您的开发服务器以使用更多内存启动。看起来我使用 -Xmx512M
(在 eclipse 中启动配置的“VM 参数”部分),您甚至可以尝试更多。或者,如果它在开发中并不重要,您可以只测试较小的上传并相信大型上传可以在生产中运行。 :)
仅供引用,如果您决定使用更多内存启动开发服务器:就我而言,一起使用 Eclipse 和 Maven,我必须创建 Maven 自动生成的启动配置的副本并修改该副本,否则 Maven 会覆盖我的配置变化。这也意味着我必须不时手动更新我的副本,例如更新 appengine SDK 时(以反射(reflect)新版本号)。
关于java - GCS - 上传较大大小的文件时出现堆错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38344261/