2012-03-02 52 views
0

我正在使用谷歌应用程序引擎开发上传表单以上传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/*

我希望有一个简单的解释(可能有)为什么代码工作在生产但不在开发中。

任何帮助将有很大的帮助。

回答

2

我目前正在与Blobstore搏斗。

我注意到你说: 的web.xml文件已被设置为处理这些请求:/ _ah /上传/,/上传/,/ _ah /上传/上传/ *

但要注意,经过blobstore已经处理了添加你的blob的请求(通过张贴到你获得createUploadUrl(“/ upload”)的URL)然后它会调用你的方法映射到web.xml中的“/ upload”。所以你一定要删除/ _ah/upload /的任何web.xml引用,因为这是blobstore会拦截的。

我这样做了一段时间,并得到一个服务器错误500,没有任何记录。

+0

我找到了解决问题的方法。我按照你说的从web.xml中删除了/ _ah/*。 我也创建了一个新的servlet来处理上传函数。我不太清楚这是如何帮助的,但系统现在按预期工作。 – TStu 2012-03-16 15:15:50

+0

太棒了,很高兴听到它的帮助。(我可以有一个信用PLZ;)我几天前也做了同样的。顺便说一句,任何人都在为这个API而努力,我发现了另一个大的GOTCHA。为了将更多参数传递给应用程序,例如图像名称或图像ID(如果您要在应用程序中保存对图像的引用),则需要将它们作为表单字段传递给您的应用程序。但是当你用上传方法阅读这些内容时,它们会被翻译成参数。令人讨厌的是,开发环境足够聪明,可以读取表单字段和参数,而不是在生产环境中。 – doright 2012-03-17 08:39:39

相关问题