Java 使用blobstore在Google应用程序引擎中上载和解析csv

Java 使用blobstore在Google应用程序引擎中上载和解析csv,java,google-app-engine,gwt,blobstore,Java,Google App Engine,Gwt,Blobstore,我正在尝试编写一个在AppEngine上运行的简单Google gwt Java应用程序 我创建了一个jsp上载表单来上载*.csv文件: <%@ page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory" %> <%@ page import="com.google.appengine.api.blobstore.BlobstoreService" %> <% Blobs

我正在尝试编写一个在AppEngine上运行的简单Google gwt Java应用程序

我创建了一个jsp上载表单来上载*.csv文件:

<%@ page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory" %>
<%@ page import="com.google.appengine.api.blobstore.BlobstoreService" %>

<%
   BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
%>
<html>
    <head>
        <title>Upload Test</title>
    </head>
    <body>
        <form action="<%= blobstoreService.createUploadUrl("/HelloWorld/ImportHandlerServlet")   %>" method="post" enctype="multipart/form-data">
             <input type="file" name="importCSV">
            <input type="submit" value="Submit">
        </form>
    </body>
</html>

上传测试
在服务器端,我编写了一个新的servlet,它应该使用openCSV将上传的CSV文件转换为关联的数组:

import au.com.bytecode.opencsv.CSVReader;

public class ImportHandlerServlet extends HttpServlet {
    private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();  
    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        PrintWriter out = resp.getWriter();

        Map<String, List<BlobKey>> blobs = blobstoreService.getUploads(req);
        List<BlobKey> bkList = blobs.get("importCSV");
        BlobKey blobKey = bkList.get(0);
        BlobstoreInputStream blobStream = new BlobstoreInputStream(blobKey);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(blobStream));

        //Print out first line to check if BufferedReader is empty
        out.println(bufferedReader.readLine());

        //New CSVReader object reading from bufferedReader
        CSVReader csvReader = new CSVReader(bufferedReader);

        //Add csv-Fields to two-dimensional array 
        List<String[]> rows = csvReader.readAll();
        String output[][] =  rows.toArray(new String[rows.size()][]);

        out.println(output.length);
    }
}
import au.com.bytecode.opencsv.CSVReader;
公共类ImportHandlerServlet扩展了HttpServlet{
私有BlobstoreService BlobstoreService=BlobstoreServiceFactory.getBlobstoreService();
@凌驾
public void doPost(HttpServletRequest-req、HttpServletResponse-resp)引发IOException{
PrintWriter out=resp.getWriter();
Map blobs=blobstoreService.getUploads(req);
List bkList=blobs.get(“importsv”);
BlobKey-BlobKey=bkList.get(0);
BlobstoreInputStream blobStream=新的BlobstoreInputStream(blobKey);
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(blobStream));
//打印第一行以检查BufferedReader是否为空
out.println(bufferedReader.readLine());
//从bufferedReader读取新的CSVRReader对象
CSVReader CSVReader=新的CSVReader(bufferedReader);
//将csv字段添加到二维数组
List rows=csvReader.readAll();
字符串输出[][]=rows.toArray(新字符串[rows.size()][]);
out.println(输出长度);
}
}
若我上传一个文件,bufferedReader会打印出文件的第一行。因此,bufferedReader不是空的,但数组不包含任何值


有人看到了可能的解决方案吗?

如果在
readAll
之前尝试
out.println(csvReader.readNext())
,您是否看到了正确的值?如果我尝试
out.println(csvReader.readNext())
它会打印出来
[Ljava.lang.String;@1fb04ae
。这不是一个正确的值。我发现,如果在CSVReader初始化之前添加
bufferedReader.readLine();
,它可以工作,但第一行(逻辑上)会丢弃并在大约1000行之后停止向数组添加以下行。您可以逐行处理数据。如果您确实需要在数组数组中表示此数据,出于某种原因,您也可以逐行构建它。