使用生产中的查询字符串将文件上载到GCS时出现404错误

时间:2015-03-06 00:21:08

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

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

我使用以下successUrl

创建了一个上传网址
"/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上发生了什么?

它可能是我的最终404但不记录它吗?如果是这样,我能做些什么呢?

以下是帖子和回复标题和内容。

响应标题

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

请求标题

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/My Action/lsdkjfalsdkfjaldkfjaldkjf

它也是404d所以我把它更改为在网址中没有空格。

/requestManager/MyAction/lsdkjfalsdkfjaldkfjaldkjf

并没有404.

是否上传服务在使用包含特殊字符的successUrls时遇到问题,例如空格和?。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

如果uploadServer返回带有404消息的内容以指示successUrl 404d并且这是我们尝试过的网址,那也很好。在那时,我们将能够更快地看到发生了什么。

我想更好的解决方法是将dev服务器运行的代码放在现场,因为开发环境工作正常。