首页>代码>html5 websocket+java实现多文件同时上传,带进度条>/socketupload/src/com/cn/upload/core/FileTarget.java
package com.cn.upload.core;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

import com.cn.upload.bean.FileInfo;
import com.cn.upload.bean.UploadCommand;
import com.cn.upload.config.ServerConfigEnum;
import com.cn.upload.service.FileServer;

public class FileTarget {
	/**上传文件基本目录*/
	private final String basePath=ServerConfigEnum.config.getSavePath();
	/**上传文件信息*/
	private FileInfo fileInfo;
	/**上传文件分片信息*/
	private SlicedInfo slicedInfo;
	/**所有上传该文件的客户端*/
	private Set<FileServer>currentFileUploaders;
	/**文件上传进度*/
	private float completePercent=0;
	/**服务器端文件名*/
	private String fileName;
	
	private File file;
	private File siFile;
	private File tempFile;
	private RandomAccessFile raFile;
	private FileChannel fileChannel;
	
	public FileTarget(){
		super();
	}
	public FileTarget(FileInfo fileInfo){
		this.currentFileUploaders=new CopyOnWriteArraySet<FileServer>();
		this.setFileInfo(fileInfo);
		this.openFileWriteAccessChannel();
//		System.out.println("Create FileTarget successed.: "+fileInfo.getFileId());
	}
	public static boolean isFileOK(FileInfo fileInfo){
		boolean isOK=false;
		String fileName=fileInfo.getFileId()+"."+fileInfo.getFileName().substring(fileInfo.getFileName().lastIndexOf(".")+1);
		if(new File(ServerConfigEnum.config.getSavePath()+fileName).exists()||fileInfo.getFileSize()==0){
			isOK=true;
		}
		return isOK;
	}
	public FileInfo getFileInfo() {
		return fileInfo;
	}
	public void setFileInfo(FileInfo fileInfo) {
		this.fileInfo = fileInfo;
		this.fileName=this.fileInfo.getFileId()+"."+this.fileInfo.getFileName().substring(this.fileInfo.getFileName().lastIndexOf(".")+1);
		this.file=new File(this.basePath+this.fileName);
		this.siFile=new File(this.basePath+this.fileInfo.getFileId()+ServerConfigEnum.config.getSuFix());
		this.tempFile=new File(this.basePath+this.fileInfo.getFileId()+".temp");
		if(!this.file.exists()&&this.slicedInfo==null){
			this.slicedInfo=SlicedInfo.getInstance(fileInfo);
		}
	}
	public SlicedInfo getSlicedInfo() {
		return slicedInfo;
	}
	public void setSlicedInfo(SlicedInfo slicedInfo) {
		this.slicedInfo = slicedInfo;
	}
	public Set<FileServer> getCurrentFileUploaders() {
		return currentFileUploaders;
	}
	public void setCurrentFileUploaders(Set<FileServer> currentFileUploaders) {
		this.currentFileUploaders = currentFileUploaders;
	}
	public float getCompletePercent() {
		return completePercent;
	}
	public void setCompletePercent(float completePercent) {
		this.completePercent = completePercent;
	}
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	public String getBasePath() {
		return basePath;
	}
	public void addUploader(FileServer fs){
		this.currentFileUploaders.add(fs);
	}
	public void removeUploader(FileServer fs){
		this.currentFileUploaders.remove(fs);
	}
	public synchronized UploadCommand getUploadCommand(){
		UploadCommand command;
		if(this.slicedInfo==null){
			command=UploadCommand.getSucccessCommand(this.fileInfo.getFileId());
		}else{
			command=this.slicedInfo.getUploadCommandRandom();
		}
		return command;
	}
	/**
	 * 保存数据
	 * @param command
	 * @return
	 */
	public synchronized FileTarget saveByteBuffer(ByteBuffer bb,UploadCommand command){
		if(command.getIndexStart()!=-1){
			try {
				this.fileChannel.write(bb, command.getIndexStart());
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			this.slicedInfo.blobComplete(command.getIndex());
			this.completePercent=this.slicedInfo.currentFileSizeAdd(command.getBlobSize()).getCompletePercent();
			if(this.completePercent>=1){
				this.fileUploadComplete();
			}
		}
		return this;
	}
	public void openFileWriteAccessChannel(){
		try {
			this.raFile=new RandomAccessFile(this.tempFile, "rw");
			this.raFile.setLength(this.fileInfo.getFileSize());
			this.fileChannel=this.raFile.getChannel();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public void closeFileWriteAccessChannel(){
		try {
			this.fileChannel.close();
			this.raFile.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void fileUploadComplete(){
//		System.out.println("File upload complete.");
		this.closeFileWriteAccessChannel();
//		System.out.println("Close file access channel success.");
		this.tempFile.renameTo(this.file);
//		System.out.println("Renam file success.");
		this.siFile.delete();
//		System.out.println("Delete si file success.");
	}
}
最近下载更多
1358849392  LV21 4月12日
xiang860568  LV1 2021年9月15日
我只想要快乐  LV1 2021年5月8日
like  LV1 2021年4月26日
cncmiss  LV1 2021年1月6日
clx190825  LV1 2020年9月22日
luchenlin  LV1 2020年8月20日
519462367  LV11 2020年7月23日
crabee  LV2 2020年7月9日
henrysternc  LV1 2020年6月9日
最近浏览更多
hzz2311465 10月8日
暂无贡献等级
1358849392  LV21 4月12日
uni-code_0123  LV1 2023年11月29日
1061302569 2023年11月16日
暂无贡献等级
110111  LV2 2023年6月3日
Tg171017  LV12 2023年2月3日
8战魂5无双8  LV43 2022年9月13日
Mayoubin2001  LV21 2022年3月26日
matintalorr  LV10 2022年3月21日
zhjwgs  LV15 2022年2月22日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友