使用生产查询字符串将文件上传到 GCS 时出现 404 错误
404 error when uploading file to GCS with query string on Production
我正在使用 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 错误,并且有 none。
我尝试上传的文件确实出现在 GCS 存储桶中。
在 blobstoreService.createUploadUrl() 的文档中没有提到不允许使用查询字符串。我还希望,如果 successUrl 有问题,则会抛出 IllegalArgumentException。
如果我直接转到 successUrl,它将使用 JSON 数据正确响应。
This is the link if you want to test
在我的本地测试服务器上它工作正常。所以我在生产环境中 仅 看到这个问题。
如果我取出查询字符串,它将起作用。如果我添加一个更简单的查询字符串,如 /cms/requestManager?blah=blah,它将 not 起作用。
有人知道发生了什么事吗?
有没有办法查看 /_ah/upload 上发生了什么?
有没有可能我这边是 404ing 但没有记录呢?如果是这样,我该怎么做才能找到它?
这是 post 和响应 headers 和内容。
回复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
请求Headers:
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,所以我将其更改为 url.
中没有空格
/requestManager/MyAction/lsdkjfalsdkfjaldkfjaldkjf
它没有 404。
可能是上传服务在使用 successUrls 时遇到问题,其中包含特殊字符,例如空格和 ?。
您发送到 blobstoreService.createUploadUrl() 的 successUrl 需要先进行 url 编码。所以我修改了获取uploadUrl的代码如下:
String successUrl = URLEncoder.encode("/requestManager/My Action/askldjfkajsdflkasdkjh", "UTF8");
String uploadUrl = blobstoreService.createUploadUrl(successUrl);
我还必须稍后解码 url 以便它可用。
在我看来,如果 successUrl 包含需要编码的字符(因为服务将 return 404,如果没有的话)那么它应该抛出 "java.lang.IllegalArgumentException - If successPath was not valid."
如果 uploadServer return 带有 404 消息的东西表明 successUrl 404d 也很好,这就是我们尝试的 url。到那时,我们将能够更快地看到发生了什么。
我想更好的解决方法是将开发服务器运行的代码放到实时,因为开发环境运行完美。
我正在使用 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 错误,并且有 none。
我尝试上传的文件确实出现在 GCS 存储桶中。
在 blobstoreService.createUploadUrl() 的文档中没有提到不允许使用查询字符串。我还希望,如果 successUrl 有问题,则会抛出 IllegalArgumentException。
如果我直接转到 successUrl,它将使用 JSON 数据正确响应。
This is the link if you want to test
在我的本地测试服务器上它工作正常。所以我在生产环境中 仅 看到这个问题。
如果我取出查询字符串,它将起作用。如果我添加一个更简单的查询字符串,如 /cms/requestManager?blah=blah,它将 not 起作用。
有人知道发生了什么事吗?
有没有办法查看 /_ah/upload 上发生了什么?
有没有可能我这边是 404ing 但没有记录呢?如果是这样,我该怎么做才能找到它?
这是 post 和响应 headers 和内容。
回复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
请求Headers:
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,所以我将其更改为 url.
中没有空格/requestManager/MyAction/lsdkjfalsdkfjaldkfjaldkjf
它没有 404。
可能是上传服务在使用 successUrls 时遇到问题,其中包含特殊字符,例如空格和 ?。
您发送到 blobstoreService.createUploadUrl() 的 successUrl 需要先进行 url 编码。所以我修改了获取uploadUrl的代码如下:
String successUrl = URLEncoder.encode("/requestManager/My Action/askldjfkajsdflkasdkjh", "UTF8");
String uploadUrl = blobstoreService.createUploadUrl(successUrl);
我还必须稍后解码 url 以便它可用。
在我看来,如果 successUrl 包含需要编码的字符(因为服务将 return 404,如果没有的话)那么它应该抛出 "java.lang.IllegalArgumentException - If successPath was not valid."
如果 uploadServer return 带有 404 消息的东西表明 successUrl 404d 也很好,这就是我们尝试的 url。到那时,我们将能够更快地看到发生了什么。
我想更好的解决方法是将开发服务器运行的代码放到实时,因为开发环境运行完美。