java - 在生产环境中使用查询字符串将文件上传到 GCS 时出现 404 错误

标签 java google-app-engine google-cloud-storage blobstore

我正在使用 flash 将文件上传到 GCS。

我使用以下 successUrl 创建上传 URL

"/cms/requestManager?ps={"1":{"action":"Upload Audio Recording","sendId":1,"data":{"fileName":"testQuestionAudioRecording","category":"testQuestionRecording"}},"jsInstanceID":"ahdzfmRldi1keW5hY3RpdmVzb2Z0d2FyZXITCxIKSlNJbnN0YW5jZRjKm-kBDKIBBmRzLmNtcw","userActive":true}"

当我发送文件上传时,它返回 404 错误。

我检查了 appengine 实例日志中是否有 404 错误,但没有

我尝试上传的文件确实显示在 GCS 存储桶中。

在 blobstoreService.createUploadUrl() 的文档中,它没有提到不允许查询字符串。我还希望如果 successUrl 出现问题,将会抛出 IllegalArgumentException。

如果我直接访问 successUrl,它将使用 JSON 数据正确响应。

This is the link if you want to test

在我的本地测试服务器上它工作正常。所以我在生产中看到这个问题。

如果我取出查询字符串,它就会工作。如果我添加一个更简单的查询字符串,例如/cms/requestManager?blah=blah ,它将无法工作。

有人知道发生了什么事吗?

有没有办法查看/_ah/upload 发生了什么?

有没有可能我这边是 404ing 但没有记录?如果是这样,我能做些什么来查明这一点?

这是帖子和响应 header 和内容。

响应 header :

HTTP/1.1 404 Not Found

Content-Length: 0

Date: Fri, 06 Mar 2015 00:25:25 GMT

Server: UploadServer ("Built on Feb 18 2015 18:10:26 (1424311826)")

Content-Type: text/html; charset=UTF-8

Alternate-Protocol: 80:quic,p=0.08

请求 header :

POST /_ah/upload/AMmfu6a-yuYk7Gm1YMtqLt-GgyizWYLXRStoAZ49FCNNRHIVXMFrRh0Jo1aCSXf4c8uXrjJnCQwvSq7cFdVeI1v5J59jQeVfwvR6STMbs0hBw-GncTI1JHgE4NItQd2JQGgyHIqTasjR4lK_5g8-M0Nf1YdWr29by5Mskk07tpSLNUE0mEW2IOjlWP_Usa7ObJMFdElVqIsgd5a_Bq198AB9oprS6DMHkiYKsdJGCTmHe93w_PEoi-XiROlHSpEsi8TLwQUPPC86iqQsn6th4OGoRudOcdAVhFxCq1VJjXx2frv_Lm0khSxpmOU2nQu8gsbP-IaAgVWMe-0UUgsLYdODjqJhgkr-IB1h05F50pAXTgzImQHyv7ygvOhHO0zGUBAiH1a072LJa7EiN1TXcBYcDfbbMikR5lBdaqfqHccx23RZrDiyGfR3kwMiXmgqFy5BJY5Ht9ZoYlfST76laeM5v2PSheMqweHIZQATBZ0Zxojzv1mFr3ECasfwEY98ambjjrbgqysPwg56B-EYDCwUBAV5FvzY6hIGKnhjun9-rorrx0CuKww/ALBNUaYAAAAAVPj2QZXMlxhUs1-Au6wnswd3PTvLwL_G/ HTTP/1.1

Host: dev-dynactivesoftware.appspot.com

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:36.0) Gecko/20100101 Firefox/36.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-US,en;q=0.7,es;q=0.3

Accept-Encoding: gzip, deflate

Cookie: ahdzfmRldi1keW5hY3RpdmVzb2Z0d2FyZXITCxIKSlNJbnN0YW5jZRjKm-kBDKIBBmRzLmNtcw=1425601513386

Connection: keep-alive

appid = dev-dynactivesoftware

successUrl length = 256

Link to blobstoreService.createUploadUrl documentation

更新:

我在我们的系统中写入了一些内容,允许将查询字符串中的数据放入 URL 中。所以而不是 /requestManager?ps={}

/requestManager/我的操作/lsdkjfalsdkfjaldkfjaldkjf

它也是 404d,所以我将其更改为网址中没有空格。

/requestManager/MyAction/lsdkjfalsdkfjaldkfjaldkjf

它没有404。

上传服务是否在使用包含特殊字符(例如空格和)的 successUrl 时出现问题?

最佳答案

您发送到 blobstoreService.createUploadUrl() 的 successUrl 需要首先进行 url 编码。所以我修改了获取 uploadUrl 的代码如下:

String successUrl = URLEncoder.encode("/requestManager/My Action/askldjfkajsdflkasdkjh", "UTF8");
String uploadUrl = blobstoreService.createUploadUrl(successUrl);

我还必须稍后解码该 URL,以便它可用。

在我看来,如果 successUrl 包含需要编码的字符(因为如果没有,服务将返回 404),那么它应该抛出“java.lang.IllegalArgumentException - 如果 successPath 无效”。

如果 uploadServer 返回带有 404 消息的内容以指示 successUrl 404d 并且这是我们尝试的 url,那就太好了。那时我们将能够更快地看到正在发生的事情。

我想更好的解决办法是直接将开发服务器运行的代码放在实时状态,因为开发环境运行完美。

关于java - 在生产环境中使用查询字符串将文件上传到 GCS 时出现 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28890338/

相关文章:

java - GWT:SDK 是否完全支持 Java?

python - GAE channel API 安全吗?底层的实现是什么?

java - 任务队列任务遇到 "Process terminated because the backend took too long to shutdown"过于频繁

java - 限制 blobstoreservice 在验证之前将文件存储在 GCS 中

google-app-engine - App Engine 上的云存储和安全下载策略。 GCS acl 或 blobstore

java - Java中的已用和空闲内存

java - 为什么可以在 PHP 中覆盖实例变量而在 Java 中不能?

java - 找不到 Java 虚拟机

python - Google App Engine 不断部署新实例,或者根本不部署(服务器错误)

apache-spark - 如何让 PySpark 在 Google Cloud Dataproc 集群上运行