java文件的上传操作

对于文件上传到服务器,这个是我们日常生活中常见的操作,今天自己写代码测试了一下,仅供参考

首先,对于文件上传我们需要两个jar包:commons-fileupload-1.2.1.jar 和 commons-io-2.4.jar

上传文件的大致思路就是,先获取该文件的输入流,然后调用write()方法,将输入流写到你要保存的位置即可

第一步,封装了一个文件属性的类FileBean:

package com;
import javax.activation.DataHandler;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlMimeType;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * 文件属性封装
 * @ClassName: File
 * @Description: TODO
 * @author FishRoad
 * 
 *
 */

@XmlRootElement  
@XmlAccessorType(XmlAccessType.FIELD)
public class FileBean {
	/**
	 * 文件名
	 */
	private String fileName;  
	/**
	 * 文件类型
	 */
    private String fileType;
    /**
     * 位置
     */
    private long position;
    /**
     * 字节数组
     */
    private byte[] bytes;
    
    @XmlMimeType("application/octet-stream")
    private DataHandler handler;
    
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	public String getFileType() {
		return fileType;
	}
	public void setFileType(String fileType) {
		this.fileType = fileType;
	}
	public long getPosition() {
		return position;
	}
	public void setPosition(long position) {
		this.position = position;
	}
	public byte[] getBytes() {
		return bytes;
	}
	public void setBytes(byte[] bytes) {
		this.bytes = bytes;
	}
	public DataHandler getHandler() {
		return handler;
	}
	public void setHandler(DataHandler handler) {
		this.handler = handler;
	}
}

然后,我们就可以来写上传文件的代码了,创建了一个名为FileUpLoad的类:

package com;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.FileChannel;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;

public class FileUpLoad {
	// 上传文件的保存路径
	public static String basepath = "D:/WEB-INF";

	public static void main(String[] args) {
		// 自己写的工具类,获取文件的路径:
		// 例如:C:\Users\Administrator\Documents\导出个性化单据\邮银财富·债券2014年第240期产品成立参数表.xls
		String path = UtilTools.getDirPath();
		// 创建文件对象
		FileBean fileBean = new FileBean();

		System.out.println(path);
		//通过文件的路径信息,获取文件的名称
		fileBean.setFileName(path.substring(path.lastIndexOf("\\") + 1,
				path.lastIndexOf(".")));
		System.out.println(fileBean.getFileName());
		//获取文件的类型
		fileBean.setFileType(path.substring(path.lastIndexOf(".") + 1));
		System.out.println(path.substring(path.lastIndexOf(".") + 1));
		//创建引用指定 DataSource 的 DataHandler 实例。数据以字节流的形式存在。DataSource 将提供一个 InputStream 来访问数据。 
		fileBean.setHandler(new DataHandler(new FileDataSource(path)));
		//获取文件的大小K
		long fileSize = getFileSize(path);
		System.out.println(fileSize);
		try {
			//上传文件
			String destpath = uploadFile(fileBean);
			System.out.println(destpath);
		} catch (IOException e) {

			System.out.println("文件上传失败!");
		}
	}

	/**
	 * 上传文件到服务器硬盘上
	 * 
	 * @param filebean
	 * @return
	 * @throws IOException
	 */
	public static String uploadFile(FileBean filebean) throws IOException {
		OutputStream os = null;
		InputStream is = null;

		File file = null;
		try {
			file = new File(basepath + "/" + filebean.getFileName() + "."
					+ filebean.getFileType() + ".tmp");

			os = new FileOutputStream(file);
			is = filebean.getHandler().getInputStream();

			byte[] bytes = new byte[1024];
			int len = 0;
			while ((len = is.read(bytes)) != -1) {
				os.write(bytes, 0, len);
				os.flush();
			}
		} catch (IOException e) {
			if (file.exists()) {
				file.delete();
			}
			throw e;
		} finally {
			try {
				if (os != null)
					os.close();
			} catch (IOException e) {
			}
			try {
				if (is != null)
					is.close();
			} catch (IOException e) {
			}
		}

		File _f = getUniqFile(filebean.getFileName(), filebean.getFileType(), 0);
		if (file != null && file.exists()) {
			if (file.renameTo(_f)) {
				return _f.getPath();
			} else {
				return null;
			}
		}
		return null;
	}

	/**
	 * 如果上传的文件名重复了,则在新的文件后面加上序号
	 * 
	 * @param fileName
	 * @param fileType
	 * @param idx
	 * @return
	 */
	private static File getUniqFile(String fileName, String fileType, int idx) {
		File _file = null;
		if (idx == 0) {
			_file = new File(basepath + "/" + fileName + "." + fileType);
		} else {
			_file = new File(basepath + "/" + fileName + "(" + idx + ")."
					+ fileType);
		}
		if (_file.exists()) {
			_file = getUniqFile(fileName, fileType, idx + 1);
		}
		return _file;
	}

	/**
	 * 根据文件的绝对路径获取文件的大小(K)
	 * 
	 * @param path
	 * @return
	 */
	private static long getFileSize(String path) {
		long size = 0;
		File _file = new File(path);
		if (!_file.exists()) {
			return 0;
		}

		FileInputStream is = null;
		try {
			is = new FileInputStream(_file);
			FileChannel ch = is.getChannel();
			size = ch.size();
		} catch (IOException ex) {
			System.out.println("获取文件大小出错!");
		} finally {
			try {
				if (is != null)
					is.close();
			} catch (IOException ex) {
			}
		}
		return size;
	}
}

获取文件路径的工具类方法:

/**
	 * swing页面形式的选择文件存储位置
	 * 
	 * @return
	 */
	public static String getDirPath() {
		JFileChooser parseDir = new JFileChooser();
		parseDir.setAcceptAllFileFilterUsed(true);
		parseDir.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
		int result = parseDir.showOpenDialog(null);
		if (result == JFileChooser.APPROVE_OPTION) {
			System.out.println(parseDir.getSelectedFile().getAbsolutePath());
			return parseDir.getSelectedFile().getAbsolutePath();
		} else {
			return "";
		}
	}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值