package UploadFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import javax.servlet.http.HttpServletRequest;
/**
*
*/
/**
* @author Fly
*
*/
/*作者:Fly
* QQ:280789588
* E-mail:linyuxiangfly@126.com
* 工作室:Fly地下第19层工作室
* 日期: 201006-27
* */
/*使用方法
* 如:upload(request,"images");
* 如:upload(request,"images/abc.txt");
* getSaveSize();返回从客户端传到服务器的数据长度,长整型
* */
public class UploadFile{
private long saveSize;//已经收到的文件大小
private boolean saveSuccess=false;
private File uploadFile=null;
//获以进度
public long getSaveSize()
{
return this.saveSize;
}
//获取是否上传文件成功
public boolean isSaveSuccess()
{
return this.saveSuccess;
}
//獲取上傳的文件路徑
public File getUploadFile()
{
return uploadFile;
}
//獲取不存在的文件
public File getNotExistsFile(String fileName)
{
File file=new File(fileName);
return getNotExistsFile(file);
}
public File getNotExistsFile(File file)
{
File tempFile=file;
int fileNumber=0;
String fileName=file.getName();
while(tempFile.exists())
{
tempFile=new File(tempFile.getParent()+"/"+fileNumber+fileName);
fileNumber++;
}
return tempFile;
}
//上传文件
public void upload(HttpServletRequest request,String path)throws IOException,WriterFileException
{
File file=new File(request.getRealPath("/")+path);
File tempFile=null;
//把request收到的数据保存到文件
tempFile=saveRequest(request,file);
//从request保存的文件读取有用的数据
this.uploadFile=saveFile(tempFile,file);
saveSuccess=true;//上传成功
if(tempFile.length()==0)
{
tempFile.delete();
}
}
//把request收到的数据保存到文件
public File saveRequest(HttpServletRequest request,File file)throws IOException,WriterFileException
{
if(file.isDirectory())
{
file=getNotExistsFile(file.getPath()+"/0.temp");//临时文件的路径
}else
{
file=getNotExistsFile(file.getPath()+".temp");//临时文件的路径
}
if(!file.exists()&&!file.isDirectory())
{
file.createNewFile();//新建文件
}
if(file.isFile())//如果文件就保存
{
InputStream is=null;
FileOutputStream os=null;
try
{
is=request.getInputStream();
os=new FileOutputStream(file);
byte[] byt=new byte[4096];
int len;
while((len=is.read(byt))>=0)
{
os.write(byt,0,len);
this.saveSize+=len;//记录进度
}
os.close();
os=null;
is.close();
is=null;
}catch(IOException e)
{
System.out.println(e);
os.close();
os=null;
is.close();
is=null;
file.delete();
}
}else if(file.isDirectory())
{
file.delete();
throw new WriterFileException("File is Directory");//抛出异常
}
if(file.length()==0)
{
file.delete();
}
return file;
}
//从request保存的文件读取有用的数据
public File saveFile(File tempFile,File file)throws IOException,WriterFileException
{
long splitPackageCount=0;//分包个数
int endPackage=0;//最后一个包的大小
long begin=0;//截取数据的开始点
long end=0;//载取数据的结束点
byte[] readData=new byte[4096];//读数据包大小
String fileNumber=null;//文件上传的编码
String fileName=null;//文件名
String contentType=null;//内容类型
RandomAccessFile raf=new RandomAccessFile(tempFile,"r");//读取临时文件
fileNumber=raf.readLine();//第一行是文件上传的编码
fileName=getFileName(new String(raf.readLine().getBytes("iso-8859-1"),"utf8"));//读取第二行截取文件名,解决中文字乱码
contentType=raf.readLine();//读取第三行
raf.readLine();//跳过第四行
//以下分包的过程
begin=raf.getFilePointer();//获取有用的数据开始点
end=raf.length()-fileNumber.length()-6;//获取有用的数据结束点
splitPackageCount=(end-begin+4095)/4096;//计算一共分几个包
endPackage=(int)((end-begin)%4096);//计算最后一个包大小
//开始写新文件
if(file.isDirectory())
{
file=new File(file.getPath()+"/"+fileName);//生成文件路径
}
file=getNotExistsFile(file);//返回不存在的文件路徑
if(!file.exists()&&!file.isDirectory())
{
file.createNewFile();//新建文件
}
if(file.isFile())//如果文件就保存
{
FileOutputStream fos=new FileOutputStream(file);//写文件
for(int i=0;i<splitPackageCount;i++)
{
raf.read(readData);//把数据读取数组
if(i==splitPackageCount-1)
{
fos.write(readData,0,endPackage);
}else
{
fos.write(readData);
}
}
fos.close();
fos=null;
}else if(file.isDirectory())
{
throw new WriterFileException("File is Directory");//抛出异常
}
raf.close();
raf=null;
tempFile.delete();//删除临时文件
return file;
}
//第request读取的字符串截取出文件名
public String getFileName(String fileName)
{
fileName=getFilePath(fileName);//截取出文件路径
int last=fileName.lastIndexOf("\\");
if(last<0)
{
last=fileName.lastIndexOf("/");
}
if(last>=0)
{
fileName=fileName.substring(last+1,fileName.length());
}
return fileName;
}
//第request读取的字符串截取出文件路径
private String getFilePath(String fileName)
{
int begin=fileName.indexOf("\"",fileName.indexOf("filename"))+1;
int end=fileName.lastIndexOf("\"");
if(begin>end)
{
fileName="";
}else
{
fileName=fileName.substring(begin,end);
}
return fileName;
}
}
//自定义异常类
class WriterFileException extends Exception
{
public WriterFileException(String exceptionMessage)
{
super(exceptionMessage);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
前往页