`
renjie120
  • 浏览: 237697 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
D11bba82-ec4a-3d31-a3c0-c51130c62f1c
Java应用集锦
浏览量:22908
社区版块
存档分类
最新评论

java应用集锦4:保存大对象 上传显示进度条

    博客分类:
  • java
阅读更多

转载请注明出处: http://renjie120.iteye.com/

 

使用fileupload上传文档,并保存到blob字段中,上传的过程中显示进度.

<form name="uploadform" id="uploadform" method="POST"
			action="upload.action" ENCTYPE="multipart/form-data" target="hidden">
			上传文件1:
			<input type="file" id="filename1" name="filename1"
				onchange="setflag(true);"
				onblur="getFileSize('filename1','fileinf1');" name="filename">
			<div id="fileinf1" style="display: none"></div>
			<br>
			上传文件2:
			<input type="file" id="filename2" name="filename2"
				onchange="setflag(true);"
				onblur="getFileSize('filename2','fileinf2');" name="sheet">
			<div id="fileinf2" style="display: none"></div>
			<br>
			上传文件3:
			<input type="file" id="filename3" name="filename3"
				onchange="setflag(true);"
				onblur="getFileSize('filename3','fileinf3');" name="sheet">
			<div id="fileinf3" style="display: none"></div>
			<br>
			上传文件4:
			<input type="file" accept="image/gif" name="filename4" id="filename4"
				onchange="setflag(true);"
				onblur="getFileSize('filename4','fileinf4');" name="sheet">
			<div id="fileinf4" style="display: none"></div>
			<br>
			<button onclick="upload();">
				上传
			</button>
		</form>

 action:

package upload;

import java.io.File;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.lsframe.mvc.ActionContext;

public class NewUpload {
	private Log log = LogFactory.getLog("logger");

	private long maxsize = 1000000000;
	UploadDao dao = new UploadDao();

	public String execute() throws Exception {
		ActionContext context = ActionContext.getContext();
		final HttpServletRequest request = context.getHttpServletRequest();

		DiskFileItemFactory factory = new DiskFileItemFactory();
		// 设置内存里面存储的文件的最大字节
		factory.setSizeThreshold(10000);
		// 设置超出文件大小限制的文件存储的位置!
		factory.setRepository(new File("c:\\temp"));
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setSizeMax(maxsize);
		
		// 下面是监听上传的进度的代码.


		ProgressListener progressListener = new ProgressListener() {
			private long megaBytes = -1;
			public void update(long pBytesRead, long pContentLength, int pItems) {
				System.out.println("We are currently reading item " + pItems);
				long mBytes = pBytesRead / 1000000;
				System.out.println(mBytes);
				if (megaBytes == mBytes) {
					return;
				}
				System.out.println(" " + pItems);
				megaBytes = mBytes;
				System.out.println("We are currently reading item " + pItems);
				if (pContentLength == -1) {
					System.out.println("So far, " + pBytesRead
							+ " bytes have been read.");
				} else {
					System.out.println("So far, " + pBytesRead + " of "
							+ pContentLength + " bytes have been read.");
				}
			}
		};
		// 对加载对象添加进度监听.
		upload.setProgressListener(progressListener);
		FileItem fi = null;
		String fileName = "";
		int endtag = 0;
		String shortName = "";
		Iterator it =  null;
		//下面的这句话必须放在上面的进度监听后面才可以在监听里面得到信息!!


		final List fileItems = upload.parseRequest(request);
		try {
			it = fileItems.iterator();
			while (it.hasNext()) {
				fi = (FileItem) it.next();
				fileName = fi.getName();
				endtag = fileName.lastIndexOf("\\");
				if (endtag == -1) {
					continue;
				}
				shortName = fileName.substring(endtag + 1);
				//下面演示保存到数据库的大对象字段
				UploadVO file = new UploadVO(shortName,fi.get(),(int)fi.getSize());
				file = dao.preSaveBlob(file);
				dao.insertIntoBlob(file);				
			}
			request.setAttribute("aaa", "上传OK!");
		} catch (Exception e) {
			e.printStackTrace();
			request.setAttribute("aaa", "上传失败,文件最大不得超过"
					+ new Long(maxsize).toString() + "字节!");
		}
		return "success";
	}

	/**
	 * 得到上传的进度信息,返回进度条的json信息..
	 * 
	 * @return
	 */
	public String getUploadProgress() {
		return null;
	}

	/**
	 * 返回指定文件的大小
	 * 
	 * @param fileName
	 * @return
	 */
	public String getMaxFileSize() {
		String str = new Long(maxsize).toString();
		return str;
	}

}

 

保存到blob字段,首先要插入一个空的blob字段占位,然后再以io流的方式写到数据库中的这个字段:

package upload;

import java.io.IOException;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import oracle.sql.BLOB;

import com.lsframe.jdbc.DBPoolManager;
import com.lsframe.jdbc.DataBase;

public class UploadDao {
	private DataBase dao = new DataBase();

	/**
	 * 添加大对象之前先保存一个位置,添加一个空的对象进去
	 * @return
	 * @throws SQLException 
	 */
	public int insertIntoBlob(UploadVO file) throws SQLException {
		String saveSql = "SELECT BLOB_CONTENT FROM TEST_BLOB_T WHERE BLOB_ID = ? FOR UPDATE";
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rest = null;
		boolean ans = false;
		conn = DBPoolManager.getInstance().getDBConn();  
		try {
			conn.setAutoCommit(false);
			pstmt = conn.prepareStatement(saveSql);
			pstmt.setString(1, file.getBlobId());
			rest = pstmt.executeQuery();

			if (rest.next()) {
				ans = saveToDatabase((BLOB) rest.getBlob("BLOB_CONTENT"),
						file.getFileContent(), file.getFsize());
			}
			conn.setAutoCommit(true);
		} catch (Exception e) {
			System.out.println("保存大对象到数据库出错!\n错误信息:" + e.getMessage());
		}  finally {
			rest.close();
			pstmt.close();
			conn.close();
        }
		return 0;
	}

	/**
	 * 将大对象以字节流的方式写入到数据库中的blob字段.
	 * @param blobContent 从数据库中返回的blob字段对象
	 * @param fileBody 要添加到字段中的文件,以字节数组的方式保存
	 * @param vSize 文件大小
	 * @return
	 * @throws IOException
	 */
	private boolean saveToDatabase(BLOB blobContent, byte[] fileBody, int vSize)
			throws IOException {
		boolean result = false;
		try {
			OutputStream outstream = blobContent.getBinaryOutputStream();
			outstream.write(fileBody, 0, vSize);
			outstream.close();
			result = true;
		} catch (SQLException e) {
			result = false;
			e.printStackTrace();
		} catch (Exception e) {
			result = false;
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 预添加大对象到数据库.
	 * @return
	 */
	public UploadVO preSaveBlob(UploadVO file) {
		String getSeq = "SELECT TESTBLOBSEQ.NEXTVAL  FROM DUAL";
		String saveSql = "INSERT INTO TEST_BLOB_T(BLOB_CONTENT,BLOB_TIME,BLOB_SIZE,BLOB_NAME,BLOB_ID) VALUES " +
				"(EMPTY_BLOB(),SYSDATE,?,?,?)";
		List argList = new ArrayList();
		argList.add(file.getFsize());
		argList.add(file.getFileName());
		int ans = 0;
		String seq = "";
		try {
			//查询数据库中的这个文件对应的流水号
			seq = dao.queryForString(getSeq);
			argList.add(seq);
			//保存文件相关信息到数据库,并在文件内容的字段上面插入空的blob对象
			ans = dao.updateRecords(saveSql,argList);
			file.setBlobId(seq);
		} catch (Exception e) {
			System.out.println("预添加大对象失败!\n错误信息:" + e.getMessage());
		}
		return file;
	}
}

 

相关的表的结构:

create table TEST_BLOB_T
(
  BLOB_ID      VARCHAR2(30) not null,
  BLOB_SIZE    NUMBER(20,4),
  BLOB_CONTENT BLOB,
  BLOB_TIME    DATE,
  BLOB_NAME    VARCHAR2(50)
)

 

分享到:
评论
1 楼 495372396 2012-09-07  


l;'l[;l'l';l';ll;'l;';l'l;'[flash=2l;';l'l;'l;'l;'
00,200][/flash]

相关推荐

    Java面试集锦: Core Java Essentials

    在这本《Java面试集锦: Core Java Essentials》中,作者Arulkumaran Kumaraswami Pillai和Sivayini Arulkumaran深入探讨了Java平台、语言、类、对象、面向对象概念与原理、数据结构、算法和模式匹配基础,为读者准备...

    Java面试题集锦6:华为面试题 管理资料.pdf

    - 包:java.util、java.io、java.lang、java.nio、java.sql - 接口:Runnable、Comparator、Serializable、Iterable 7. **ArrayList、Vector和LinkedList的比较**: - ArrayList和Vector都是基于数组实现,提供...

    Java编程精选集锦

    4. **集合框架**:Java集合框架包括List(如ArrayList,LinkedList),Set(如HashSet,TreeSet),Map(如HashMap,TreeMap)等接口和类。它们提供了存储和操作对象的高效方式。 5. **IO流**:Java的IO流库支持...

    Java笔试题集锦:web\jsp\sevlet

    2. **J2EE**:Java 2 Platform, Enterprise Edition(J2EE)是Sun公司推出的企业级应用平台,它提供了一个多层架构,包括客户端层、Web层(如Servlet和JSP)、业务逻辑层(EJB)和企业信息系统层(如数据库)。...

    Java经典项目集锦

    4. **IO与NIO**:Java的输入/输出(I/O)和非阻塞I/O(NIO)是处理文件读写、网络通信的关键。通过实现文件管理系统或网络聊天应用,学习者可以深入理解流的概念,学会使用BufferedReader、BufferedWriter等类,以及NIO...

    基于NetBeans开发的java应用程序集锦1

    5. **鼠标操作**:Java的java.awt.event包提供了一系列鼠标事件,如MouseClicked、MouseDragged等,这些事件可以与特定的图形元素关联,实现交互式功能。 6. **计算器**:计算器应用通常涉及到基本的算术运算,可以...

    JAVA案例开发集锦pdf

    4. **异常处理**:Java中的异常处理机制是程序健壮性的重要保障,书中的例子会展示如何使用try-catch-finally语句块捕获和处理异常。 5. **IO流**:Java的输入/输出流系统允许程序与外部资源交互,如文件操作、网络...

    基于NetBeans开发的java应用程序集锦6

    【标题】"基于NetBeans开发的Java应用程序集锦6"主要涵盖了使用NetBeans IDE进行Java应用程序开发的一些实例和实践。NetBeans是一个强大的开源集成开发环境,尤其适合Java开发者,提供了丰富的功能,包括代码编辑、...

    java技术文章集锦

    13. **JPA与Hibernate**:Java持久化API和ORM(对象关系映射)框架,理解SQL与对象模型的映射。 14. **Java EE技术**:Servlet、JSP、JSF、EJB等,用于构建企业级Web应用程序。 15. **并发编程**:线程池、并发容器...

    java面试笔试题集锦

    4. **多线程**:Java提供了丰富的多线程支持,如Thread类、Runnable接口、同步机制(synchronized关键字、Lock锁、信号量等)、线程池(ExecutorService)等。 5. **IO流与NIO**:输入/输出流的理解,以及...

    基于NetBeans开发的java应用程序集锦8

    【标题】基于NetBeans开发的Java应用程序集锦8 在这个集合中,我们聚焦于使用NetBeans IDE进行Java应用程序开发,特别是针对J2EE(Java 2 Platform, Enterprise Edition)技术的应用。NetBeans作为一款强大的开源...

    JAVA案例开发集锦(1)

    JAVA案例开发集锦:分六个压缩卷,请都下载了再解压 第一压缩卷 下完后请把文件名改为:JAVA案例开发集锦[1].part1.rar.rar

    Java案例开发集锦(第二版)源代码

    4. **IO流**:Java的IO流系统是处理输入输出的重要工具,案例可能涵盖了文件读写、网络流、对象序列化等场景,帮助读者掌握数据传输和存储的方法。 5. **多线程**:Java提供了丰富的多线程支持,案例可能涉及线程...

    java笔试题经典集锦

    18. **Lambda表达式**:Java 8引入的新特性,简化函数式接口的使用,提高代码的简洁性和可读性。 19. **Stream API**:处理集合数据的新方式,支持链式操作,方便进行数据过滤、映射和聚合。 20. **并发库(Java ...

    Java案例开发集锦第一版源代码

    4. **集合框架**:Java集合框架包括List、Set、Queue、Map等接口及其实现类,如ArrayList、LinkedList、HashSet、HashMap等,提供了存储和操作对象的高效方式。 5. **I/O流**:Java的I/O流用于读写文件、网络通信等...

    Java数据结构面试题集锦:深入探索数据结构的核心概念和应用

    本篇面试题集锦涵盖了数据结构的基本概念、常见类型以及它们在Java中的应用。 1. **数据结构**:数据结构是组织和存储数据的方式,目的是提高数据操作的效率。它包括了如何组织数据(如数组、链表),如何访问数据...

    JAVA案例开发集锦(4)

    JAVA案例开发集锦 第四压缩卷 下完后请把文件名改为:JAVA案例开发集锦[1].part4.rar.rar

    基于NetBeans开发的java应用程序集锦5

    【标题】:“基于NetBeans开发的Java应用程序集锦5” 【描述】中提及的Java与网络的7个案例,展示了Java在实际应用中的强大功能,包括: 1. **简单多线程服务器**:在Java中,多线程是并发处理的基础,通过实现...

    JAVA案例开发集锦.pdf 下载

    1. Java编程基础:案例集锦从Java的基础概念讲起,包括类、对象、接口、线程和继承等关键概念。这些是Java编程的核心,每个Java开发者都必须熟练掌握。 2. Applet案例:书中包含有关Java Applet的案例,这是一种...

    Java编程精选集锦(附源代码)

    4. **集合框架**:Java集合框架是存储和管理对象的工具,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)。了解它们的特点、用法以及如何操作它们,是提高代码效率的...

Global site tag (gtag.js) - Google Analytics