1

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

我需要做其他事情还是必须先将其写入磁盘然后再读取?

4

2 回答 2

2

用户指南有一些关于如何执行此操作的文档:

// 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 级别。

于 2013-03-26T14:48:38.170 回答
0

我得到的错误是:

NullPointerException:字符集名称

(没有堆栈跟踪 - 我假设我的 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();

解决了问题

于 2013-03-26T14:41:40.123 回答