我正在编写一个Google App Engine应用程序,使用表单POST和createUploadUrl方法将文件上传到Blobstore。在处理上载的HttpServlet中,UserService.getCurrentUser和getUserPrincipal返回null。用户已登录,其他RemoteServiceServlet调用可以检索它。如何在上传过程中获取登录的用户名?
答案 0 :(得分:0)
如果所有其他方法都失败了,您可以将表单作为参数发送,或者将名称添加到您可以在处理程序中检索的会话对象中。但是在HTTP POST(python)中获取用户名和其他任何地方一样,并且应该使用Java工作。
但无论如何你有3个选择: - 应该工作的普通方式 - 如果失败,请在表单提交页面上获取用户名和表单 - 如果所有其他方法都失败,请使用会话对象,您可以在其中检索用户名
理想的解决方案是第一种,其他两种是解决方法,因为您的工作方式应该有效。
答案 1 :(得分:0)
我假设您只在本地开发模式下获得此功能。如果是这样,这里是解释(和解决方案):用户登录到127.0.0.1但是为新上载返回到blobstore(在本地模式下)的URL包含计算机名称。因此,在POST重定向从blobstore到上传处理程序期间会话中断,并且您的服务不会将用户识别为已登录。
这是一种解决方法。下面的方法存在于服务器上,可以直接通过RPC(来自GWT应用程序)或servlet来调用:
public String getNewUploadLink() {
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
String url = blobstoreService.createUploadUrl("/myappname/upload");
String modifiedUrl = url.replace("ThisIsMyComputerName", "127.0.0.1");
return modifiedUrl;
}
您会看到它在将URL返回给客户端之前对其进行操作。一个更好的版本将检查服务是在dev或生产模式下运行,然后相应地采取行动,但它突出了这个问题的根本原因,以便您可以继续在本地计算机上进行开发。