之前我曾经使用过fileUpload将文件上传到我们的服务器上,但现在我必须做些不同的事情。正在上传的文件永远不会写入磁盘,而是应该逐行读取并插入到数据库中 - 每行代表优惠券/折扣 - 它是一个内部内容管理系统,因此文件永远不会大于10行左右,最多100行
我尝试将我的工作代码推送到刚使用BufferedReader并在读入时对其进行处理,但我不断得到NullPointerException(虽然堆栈跟踪丢失,所以我必须使用log4j来获取正确的输出)。有没有人在网上看过一个例子或知道我做错了什么?
我的代码段:
BufferedInputStream in = null;
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = upload.parseRequest(request);
String enc = request.getCharacterEncoding();
for (FileItem item : items) {
if (item.isFormField()) {
if ("code".equalsIgnoreCase(fileItem.getFieldName()))
this.code = fileItem.getString(enc);
... // set these to local variables
} else {
in = new BufferedInputStream(new FileInputStream(item.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
insert2DB(line);
}
}
}
我是否需要做其他事情或者我必须先将其写入磁盘然后阅读它?
答案 0 :(得分:2)
user's guide有一些关于如何执行此操作的文档:
// Create a factory for disk-based file items
FileItemFactory factory = new DiskFileItemFactory();
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Parse the request
List /* FileItem */ items = upload.parseRequest(request);
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
InputStream uploadedStream = item.getInputStream();
// your database code goes here
uploadedStream.close();
}
每log4j,您需要一个如下结构的属性文件:
# Root logger option
log4j.rootLogger=DEBUG, file, us
# Direct log messages to a plaintext log
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=public_html/news.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.appender.stderr=org.apache.log4j.ConsoleAppender
log4j.appender.stderr.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1} %L - %m%n
log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
...并记录堆栈跟踪,在catch块中放置loggerInstance.error(exceptionInstance.getMessage(), exceptionInstance);
并记录完整的堆栈跟踪,假设也记录了ERROR级别。
答案 1 :(得分:0)
我得到的错误是:
NullPointerException:charsetName
(没有堆栈跟踪 - 我假设我的log4j没有为这个apache项目设置)
无论如何,这是因为我的旧版本使用了apache的commons-fileupload-1.0而新版本使用的是2.0。
在旧的(我忘了上面的代码)中,它做到了这一点:
String enc = request.getCharacterEncoding();
for (FileItem fileItem:fileItems) {
if (fileItem.isFormField()) {
if ("code".equalsIgnoreCase(fileItem.getFieldName()))
this.code = fileItem.getString(enc);
^^^
胡萝卜标记是抛出错误的原因。使用1.0,这将永远返回为非null,在2.0中,它返回为null并在那里炸毁。
将其更改为:
this.code = fileItem.getString();
解决了问题