Google App Engine - Blobstore请求正在制作中,不在开发中
问题描述:
我正在使用谷歌应用程序引擎开发上传表单以上传csv文件。 我目前遇到的问题是,在开发环境中,请求操作是要正确发送。Google App Engine - Blobstore请求正在制作中,不在开发中
在生产环境中,虽然两种表单的操作都是相同的,但请求操作似乎正常工作。
E.g.
发展
action="http://localhost:8080/_ah/upload/ag50cy1zY2gtcmVwb3J0c3IbCxIVX19CbG9iVXBsb2FkU2Vzc2lvbl9fGAEM"
生产行动:
action="http://website.appspot.com/_ah/upload/AMmfu6Yer2BJaT_tW_fmc- PKvHaOHD3pnv5QH6o6d8XQQujbCWg5egbjf2sGxP5_cN6uAyvgDVOn8U40wLLXEvoQcrMDbHQQByJpTlamzBPz_8x8LN2UWKM/ALBNUaYAAAAAT1EmxMkvj7tiS9WAvYAWKPG1sN1DvmMk/"
当我在日志中调查,开发服务器状态的动作是: “/ ag50cy1zY2gtcmVwb3J0c3IbCxIVX19CbG9iVXBsb2FkU2Vzc2lvbl9fGAEM”
凡为生产日志状态的动作是: “/ form”(如预期)
两者的代码在下面是相同的,如下所示。
文件:upload.jsp
<%
request.getAttribute("message");
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
%>
<hr/>
<p>Upload a .csv file to the system.</p>
<fieldset>
<legend>Upload File</legend>
<form action="<%= blobstoreService.createUploadUrl("/upload/form") %>" method="post" enctype="multipart/form-data">
<label for="filename_1">File: </label>
<input id="filename_1" type="file" id="filename_1" name="file" size="30" onchange="checkInput();" /><br/>
<br/>
<input type="submit" id="submitBtn" value="Upload File" />
</form>
</fieldset>
文件:controller.java
else if (action.equals("/form")) {
Logger.getLogger(Controller3.class.getName()).log(Level.INFO, action);
Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(request);
List<BlobKey> bkList = blobs.get("filename_1");
BlobKey blobKey = bkList.get(0);
if (blobKey == null) {
Logger.getLogger(Controller3.class.getName()).log(Level.WARNING, "Blob null");
response.sendRedirect("/");
} else {
Logger.getLogger(Controller3.class.getName()).log(Level.WARNING, "Blob not null");
FileService fileService = FileServiceFactory.getFileService();
// Create a new Blob file with mime-type "text/plain"
AppEngineFile file = fileService.getBlobFile(blobKey);// Again, different standard Java ways of reading from the channel.
FileReadChannel readChannel = fileService.openReadChannel(file, false);
Reader reader1 = new BufferedReader(Channels.newReader(readChannel, "UTF8"));
char c = ',';
CSVReader reader = new CSVReader(reader1, c);
ArrayList<ArrayList<String>> results = reader.getResults();
ArrayList<String> columns = reader.getColumns();
request.setAttribute("maxColumns", columns);
request.setAttribute("csvResults", results);
//Remove the CSV file from the blobstore now we have used it.
blobstoreService.delete(blobKey);
this.getServletContext().setAttribute("csvUploadResults", results);
}
的web.xml文件已被设置为处理这些请求: /_ah /上传/ ,/upload/,/ _ah/upload/upload/*
我希望有一个简单的解释(可能有)为什么代码工作在生产但不在开发中。
任何帮助将有很大的帮助。
答
我目前正在与Blobstore搏斗。
我注意到你说: 的web.xml文件已被设置为处理这些请求:/ _ah /上传/,/上传/,/ _ah /上传/上传/ *
但要注意,经过blobstore已经处理了添加你的blob的请求(通过张贴到你获得createUploadUrl(“/ upload”)的URL)然后它会调用你的方法映射到web.xml中的“/ upload”。所以你一定要删除/ _ah/upload /的任何web.xml引用,因为这是blobstore会拦截的。
我这样做了一段时间,并得到一个服务器错误500,没有任何记录。
我找到了解决问题的方法。我按照你说的从web.xml中删除了/ _ah/*。 我也创建了一个新的servlet来处理上传函数。我不太清楚这是如何帮助的,但系统现在按预期工作。 – TStu 2012-03-16 15:15:50
太棒了,很高兴听到它的帮助。(我可以有一个信用PLZ;)我几天前也做了同样的。顺便说一句,任何人都在为这个API而努力,我发现了另一个大的GOTCHA。为了将更多参数传递给应用程序,例如图像名称或图像ID(如果您要在应用程序中保存对图像的引用),则需要将它们作为表单字段传递给您的应用程序。但是当你用上传方法阅读这些内容时,它们会被翻译成参数。令人讨厌的是,开发环境足够聪明,可以读取表单字段和参数,而不是在生产环境中。 – doright 2012-03-17 08:39:39