1

以前にfileUploadを使用して1つのサーバーにファイルをアップロードしましたが、今は別のことをする必要があります。アップロードされているファイルがディスクに書き込まれることはありませんが、代わりに1行ずつ読み取って、DBに挿入する必要があります(各行はクーポン/割引を表します)。これは内部コンテンツ管理システムであるため、ファイルが10行程度より大きく、最大100行。

作業コードをtweekingして、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ブロックにputloggerInstance.error(exceptionInstance.getMessage(), exceptionInstance);を入力すると、ERRORレベルもログに記録されると仮定して、完全なスタックトレースがログに記録されます。

于 2013-03-26T14:48:38.170 に答える
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();

問題を修正しました

于 2013-03-26T14:41:40.123 に答える