Java 使用blobstore在Google应用程序引擎中上载和解析csv
我正在尝试编写一个在AppEngine上运行的简单Google gwt Java应用程序 我创建了一个jsp上载表单来上载*.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
<%@ 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行之后停止向数组添加以下行。您可以逐行处理数据。如果您确实需要在数组数组中表示此数据,出于某种原因,您也可以逐行构建它。