Webプロジェクトでjava Struts 2を使用してZip、xmlファイルの動的作成とダウンロードを実現(Zipファイルに複数のxmlファイルが動的に存在する)

4504 ワード

Webプロジェクトではzipを動的に生成してダウンロードする必要がある場合がありますが、zipファイルを生成するときは冗長な一時ファイルを生成したくありません.次は
私の対処法を紹介します.不適切な点があれば、皆さんにご指導をお願いします.
今回の要件は次のとおりです.
1.データに基づいてXMLファイルを動的に生成する
2.動的に生成されたXMLファイル(1つまたは複数)を統合して1つのZipファイルにパッケージ化する
3.お客様がブラウザでクリックしてZipファイルのダウンロードを完了する
以下、対応機能の開発を開始します
1.データから動的に生成するXMLファイルここではdom 4 j-1.6を用いる.1.jarはXMLの読み取りと作成を実現する:
public class XmlHandleDom4jHelper{

	/**
	 * Creating a new XML document
	 * 
	 * @author hli
	 */
	public static Document generateDocument() {
		Document document = DocumentHelper.createDocument();
		document.addComment("  XML");
		Element root = document.addElement("root");
		Element author1 = root.addElement("author").addAttribute("name", "  ").addAttribute("age", "25").addText("  ");
		
		Element author2 = root.addElement("info").addAttribute("QQ", "317962765").addText("317962765");
		
		return document;
	}
	
	
	/**
	 * Writing a document to a file
	 * 
	 * @param document
	 * @throws IOException
	 */
	public static void write(ByteArrayOutputStream byteArrayOutputStream,Document document) throws IOException {
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setTrimText(true);
		format.setNewLineAfterDeclaration(false);
		XMLWriter writer = new XMLWriter(byteArrayOutputStream, format);
		writer.write(document);
		writer.flush();
		writer.close();
	}
}
	

2.Zipファイルの動的生成
/**
	 *   ZIP  (       )
	 * 
	 * @param out
	 * @author hli
	 * @return byte[] ZIP  byte  
	 */
	public byte[] generateCommonTransZipStreamNoTempFile() {
		
		byte[] zipData = null;
		try {
			
			List xmlFileListByteOutputStream = new ArrayList();
			
			ByteArrayOutputStream xmlFileByteArrayOutputStream = null;
			
			for ( int num = 1 ; num < 3 ; num++ ) {
				
				xmlFileByteArrayOutputStream = new ByteArrayOutputStream();
				
				Document document = XmlHandleDom4jHelper.generateDocument();
				
				XmlHandleDom4jHelper.write(xmlFileByteArrayOutputStream,document);		
			
				
				xmlFileListByteOutputStream.add(xmlFileByteArrayOutputStream);
				
			}
			
			ByteArrayOutputStream outputStreamByte = new ByteArrayOutputStream();
			// ----    :
			// FileOutputStream f = new FileOutputStream("F:\\report\\abc.zip");
			
			//             
			CheckedOutputStream csum = new CheckedOutputStream(outputStreamByte, new CRC32());
			
			ZipOutputStream zos = new ZipOutputStream(csum);
			zos.setEncoding("GBK");
			
			for ( int i = 0 ; i < xmlFileListByteOutputStream.size() ; i++ ) {
				
				ByteArrayOutputStream byteStream = xmlFileListByteOutputStream.get(i);
				
				byte[] bytes = byteStream.toByteArray();
				
				ByteArrayInputStream byInputStream = new ByteArrayInputStream(bytes);
				
				//       ZIP                  
				ZipEntry zipEntry = new ZipEntry("Test_xml_file_" + i);
				zos.putNextEntry(zipEntry);
				byte[] buffer = new byte[1024];
				int readCount = byInputStream.read(buffer);
				
				while (readCount != -1) {
					zos.write(buffer, 0, readCount);
					readCount = byInputStream.read(buffer);
				}
				//  ,            ,             ,                     
				zos.flush();
				
				//        
				byInputStream.close();
				
			}
			zos.closeEntry();//       close,     ZIP  
			
			zos.close();
			
			zipData = outputStreamByte.toByteArray();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return zipData;
	}

3.お客様がブラウザでクリックしてZipファイルのダウンロードを完了する
ここではStruts 2のファイルダウンロード機能を使用します
備考:私の別の文章を参考にします:クリックしてリンクを開きます
A>actionでエンコード:
public InputStream getDownZipStream() {
		
		byte[] zipData = reportService.generateCommonTransZipStreamNoTempFile();
		
		//          
		//    ,       
		downFileName = "downZip.zip";
		
		
		return new ByteArrayInputStream(zipData);
	}

B>Struts 2プロファイル:

			
				application/zip
				downZipStream
				attachment;filename="${downFileName}"
				4096
	
	

上記のプログラミングが完了すると、必要な要件が実装され、一時的なファイル生成が行われません.備考:javaのアップロード方法の実現には最適化が必要で、しばらくメモしておき、後で改善する.