package cn.lnu.web.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
//ʹ��apache��Դ��֯�ṩ��fileupload�������ǰ̨�������ϴ��ļ�����
public class UploadServlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List types=Arrays.asList("jpg","bmp","avi","rmvb","exe","txt","doc","docx");//�����ļ��ϴ�����ֻ�����⼸������
try{
DiskFileItemFactory factory=new DiskFileItemFactory();//���ȴ���һ��FileItem��������
factory.setSizeThreshold(1024*1024);//���ý����������СΪ1MB������ϴ��ļ�С��1M�������ϴ��ļ��Ǵӻ����ж�ȡ���������1M,���ϴ��ļ��ȱ��浽�����ļ��У�֮���ȡ�ϴ��ļ�������������Զ��ӻ����ļ��ж�ȡ�ϴ��ļ������ݣ������Ǵӻ����ж�ȡ
factory.setRepository(new File(this.getServletContext().getRealPath("/temp")));//���������1Mʱ���ϴ��ļ����浽�����ļ������ﻹ�������û����ļ���Ŀ¼
ServletFileUpload upload=new ServletFileUpload(factory);//��fileitem�������ݸ�һ��������
//��������μ����ϴ����ȣ�Ϊǰ̨�ṩ��������ý��������ݣ������ڽ���������֮ǰ�������������
upload.setProgressListener(new ProgressListener(){
public void update(long pBytesRead, long pContentLength, int pItems) {
System.out.println("��ǰ�ѽ�����"+pBytesRead+"�ֽ�");
System.out.println("�����ļ��ܳ��ȣ�"+pContentLength+"�ֽ�");
System.out.println("���ڽ������ڣ�"+pItems+"��");
}
});
upload.setFileSizeMax(1024*1024*5);//ͨ�������������ϴ��ļ����ܳ���5M,������׳��쳣
if(!upload.isMultipartContent(request)){//���ǰ̨��װ��request�е����ݲ����ϴ�������
//����ͳ��ʽ��ȡ������
String username=request.getParameter("username");
//....
return;
}
upload.setHeaderEncoding("UTF-8");//Ϊ�˷�ֹ�ϴ��ļ������������⣬��Ҫ����һ�½������ı���
List<FileItem> list=upload.parseRequest(request);//ʹ�ý���������ǰ̨��������request���õ������������ϴ����ݵ�list���ϣ�������ÿ��Ԫ�ض���һ��FileItem�������Ǵ������ͨ�����Ҳ���ܴ�������ϴ��ļ�������
for(FileItem item:list){//�������list���ϻ�÷�װ��ÿ���������FileItem���ж����item����ͨ���������ֶΣ������ļ��ϴ��ֶ�
if(item.isFormField()){//��ʾ��ǰ������item��һ����ͨ������
String inputName=item.getFieldName();//���ǰ̨�����������
String inputValue=item.getString("UTF-8");//�����ͨ�������ֵ,��ָ����ȡһ��������ֵʹ�õ����
/*String inputValue=item.getString();//�����ͨ�������ֵ
inputValue=new String(inputValue.getBytes("iso8859-1"),"UTF-8");//�ֶ����һ��������ֵ��������������*/
System.out.println(inputName+"="+inputValue);
}else{//����ǰ�����item���װ�����ϴ��ļ�������������������ݣ�д������Ӳ�̻��߷�������ij��Ŀ¼
String filename=item.getName().substring(item.getName().lastIndexOf("\\")+1);//��ȡ�ϴ��ļ����������ie6�������������ȫ·�����ļ���C:\Users\MoGu\Desktop\1.txt����IE7���ϻ��ֻ�ǵ������ļ���1.txt
if(filename==null || filename.trim().equals("")){//�����ϴ��ļ����Ƿ�Ϊ�գ���û��ѡ���ļ��ϴ������Σ���������ѭ���������´�ѭ�����������������ļ��ϴ�
continue;
}
String ext=filename.substring(filename.lastIndexOf(".")+1);//��ȡ�ļ���չ��
if(!types.contains(ext)){//����ϴ��ļ���չ������list�����У���ʾ�û��ϴ��ļ����Ͳ�֧��
request.setAttribute("message", "����վ��֧����չ��Ϊ"+ext+"���ļ��ϴ�������");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
InputStream in=item.getInputStream();//���һ�������ϴ��ļ�������������ܴ���������ϴ��ļ�û���������С����Ͱ����淽���ӻ����ж�ȡ�ϴ��ļ����ݣ�����ϴ��ļ������˻����С(1M),���Զ�ȥ����Ŀ¼�µĻ����ļ��ж�ȡ�ϴ��ļ����ݣ����浽���أ�������ȥ�����ж�ȡ�ˣ�������Ҳû������
int len=0;
byte buffer[]=new byte[1024];
//FileOutputStream out=new FileOutputStream("c:\\"+filename);//ʹ����������������ļ������ݱ��浽c���µ�����Ϊfilename���ļ���
String saveFileName=generateFileName(filename);
String savepath=generateSavePath(this.getServletContext().getRealPath("/WEB-INF/upload"),saveFileName);
//ʹ���������������Ψһ�ļ����ͷ�ɢĿ¼������ʵ���ϴ��ļ��������������ͬĿ¼�±���
FileOutputStream out=new FileOutputStream(savepath+File.separator+saveFileName);//ʵ�ʿ������ǽ��ϴ��ļ��ϴ����������У���������ϴ�Ŀ¼����ֱ�ӱ������ʵ�
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
out.close();
item.delete();//ɾ�������ϴ��ļ����浽����Ŀ¼�µ���ʱ�ļ�����������������ر�֮��
}
}
}catch(FileUploadBase.FileSizeLimitExceededException e){//�ϴ��ļ���С�����쳣
e.printStackTrace();
request.setAttribute("message", "�ϴ��ļ���С���ܳ���5M!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}catch(Exception e){
throw new RuntimeException(e);
}
request.setAttribute("message", "�ϴ��ɹ���");
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
public String generateSavePath(String path,String filename){//�����ļ���ʹ��hash�㷨������Ŀ¼��Ȼ����Щ��Ŀ¼�����ڴ��ݽ�����savepathĿ¼��
int hashcode=filename.hashCode();//�õ��ļ�������ַ����������ڴ��еĵ�ַ32λϵͳ����һ���ĸ��ֽڵ�����
int dir1=hashcode&0xf;//�û��ļ�����ϣֵ�ĺ���λ��һ���ļ�Ŀ¼
int dir2=(hashcode>>4)&0xf;//�û��ļ�����ϣֵ������λ��ȥ����λ�������ļ�����Ŀ¼
//���ձ���Ŀ¼Ϊ��
String savepath=path+File.separator+dir1+File.separator+dir2;
File file=new File(savepath);//���ڵ�һ���ϴ�ʱ�����Ŀ¼��û�д����ڴ��̣����Ա������ж�һ�£�û�д����Ļ����յ�����
if(!file.exists()){
file.mkdirs();//�����Ƕ༶Ŀ¼������ʹ��mkdirs()�������
}
return savepath;
}
//Ϊ�ϴ��ļ�����һ��Ψһ���ļ���
public String generateFileName(String filename){
return UUID.randomUUID().toString()+"_"+filename;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}