2013-03-26 63 views
1

我已经使用fileUpload一次之前上传文件到我们的服务器,但现在我必须做一些不同的事情。正在上传的文件永远不会写入磁盘,而应逐行读入并插入到数据库中 - 每行代表优惠券/折扣 - 这是一个内部内容管理系统,因此文件永远不会大于10行左右,最大100行apache commons-fileupload是否总是要写入磁盘?

我试着用我的工作代码来使用BufferedReader并在读入时对其进行处理,但我不断收到NullPointerException(尽管stacktrace丢失了,所以我必须使用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

你忘了告诉'null'究竟是什么。 – BalusC 2013-03-26 01:07:28

+0

明天我可以做到这一点......我试图早点跳过工作...... – 2013-03-26 03:12:17

回答

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

+0

我回答我的问题时没有看到你的。因为它不会让我接受我的,直到明天我会接受你的,因为它是正确的。我的错误是使用在2.0版本中始终返回为空的编码! – 2013-03-26 14:52:07

+0

你可以做的另一件事是投票吗? – hd1 2013-03-26 14:53:21

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时,它总是会返回非空值,在2.0中,它会回到空值并立即炸毁。

将其更改为:

this.code = fileItem.getString(); 

固定的问题