apache commons-fileupload总是要写入磁盘吗?

时间:2013-03-26 00:58:07

标签: java apache jsp servlets apache-commons-fileupload

之前我曾经使用过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);
        }
    }
}

我是否需要做其他事情或者我必须先将其写入磁盘然后阅读它?

2 个答案:

答案 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();

解决了问题