-1

クライアントからファイルを受け取りXMLます。Base-64XMLファイルの要素の1つに埋め込んだエンコードされたデータを含む別のファイルがあります。このすべてのマージを行った後、ファイルの内容をstringまたはDOMオブジェクトとして返す必要がありますInputStream

しかし、結果のマージされたファイルはnull character最後にあり、ファイルが として処理されるときに問題を引き起こしていますXML。どうすればそれを取り除くことができますか。これは、ファイルをマージする方法です。

public Object merge(List<File> files) throws Exception {
    System.out.println("merge with arguments is called");

    if(files == null || files.isEmpty() || files.size()<2){
        throw new IllegalArgumentException("File list cannot be null/empty and minimum 2 files are expected");
    }

    File imageFile = getImageFile(files);
    File indexFile = getIndexFile(files);

    File inProcessFile = new File("temp/" + indexFile.getName().replaceFirst("[.][^.]+$", "") + ".xml");
    File base64EncodedFile = toBase64(imageFile);

    /* Write from index file everything till attachment data to inProcess file*/
    Scanner scanner = new Scanner(indexFile).useDelimiter("\\s*<AttachmentData>\\s*");      
    FileWriter writer = new FileWriter(inProcessFile);
    writer.append(scanner.next());

    /* Write <AttachmentData> element into inProcess file */
    writer.append("<AttachmentData>");

    /* Write base64 encoded image data into inProcess file */
    IOUtils.copy(new FileInputStream(base64EncodedFile), writer);

    /* Write all data from </AttachmentData> element from index file into inProcess file */
    String fileAsString = IOUtils.toString(new BufferedInputStream(new FileInputStream(indexFile)));
    String afterAttachmentData = fileAsString.substring(fileAsString.indexOf("</AttachmentData>"));

    InputStream input = IOUtils.toInputStream(afterAttachmentData);
    IOUtils.copy(input, writer);

    /* Flush the file, processing completed */
    writer.flush();
    writer.close();
    System.out.println("Process completed");
}


private File getIndexFile(List<File> files) {
        for(File file:files){
            String extension = FilenameUtils.getExtension(file.getName());
            if(extension.equalsIgnoreCase(IDX_FILE_EXT))
                return file;
        }

        throw new IllegalArgumentException("Index file doesn't exist or cannot be read.");

    }


    private File getImageFile(List<File> files) {
        for(File file:files){
            String extension = FilenameUtils.getExtension(file.getName());
            if(extension.equalsIgnoreCase(IMG_FILE_EXT))
                return file;
        }

        throw new IllegalArgumentException("Image file doesn't exist or cannot be read.");

    }


    private File toBase64(File imageFile) throws Exception {
        System.out.println("toBase64 is called");
        Base64InputStream in = new Base64InputStream(new FileInputStream(imageFile), true);
        File f = new File("/temp/" + imageFile.getName().replaceFirst("[.][^.]+$", "") + ".txt");
        Writer out = new FileWriter(f);
        IOUtils.copy(in, out);
        return f;
    }

null 文字を生成するコードを修正する方法を理解するのを手伝ってください

4

1 に答える 1

3

おそらくその一部または全体を削除して、それを生成するコードを修正します。これを見つけるには、次の質問を自問する必要があります。

  1. クライアントから受け取った元の XML ファイルにヌル文字が既に存在しますか?
  2. base-64 データを含む要素は、XML ドキュメントのどの位置に表示されますか?
  3. null 文字は、XML ドキュメントのどの位置に表示されますか?
  4. base-64 ファイルを何らかの形式でデコードしていますか?
  5. base-64 ファイルにヌル文字が含まれていますか?
  6. はいの場合、なぜですか?
  7. base-64 でエンコードされたデータを XML ドキュメントに「マージ」するために使用される方法はどれですか?

OPによって後で生成される情報に従って、ファイルに常にnull文字が含まれている場合、最も簡単な解決策は次の行を置き換えることです。

String afterAttachmentData = fileAsString.substring(fileAsString.indexOf("</AttachmentData>"));

String afterAttachmentData = fileAsString.substring(fileAsString.indexOf("</AttachmentData>"),fileAsString.length()-1);

ただし、長い目で見れば、最後にヌル文字が生成されているかどうかをクライアントに確認し、そうであれば、それを生成するコードを修正して XML ドキュメントが有効になるように提案する方がはるかに優れています。

于 2013-08-27T16:06:44.523 に答える