一、jsp+servlet实现文件上传与下载源码
上传:
需要导入两个包:commons-fileupload-1.2.1.jar,commons-io-1.4.jar
import java.io.File;
import java.io.IOException;
import java.util.List;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
*上传附件
*@author new
*
*/
public class UploadAnnexServlet extends HttpServlet{
private static String path="";
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
doPost(request, response);
}
/*
* post处理
*(non-Javadoc)
*@see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
path= this.getServletContext().getRealPath("/upload");
try{
DiskFileItemFactory factory= new DiskFileItemFactory();
ServletFileUpload up= new ServletFileUpload(factory);
List<FileItem> ls= up.parseRequest(request);
for(FileItem fileItem: ls){
if(fileItem.isFormField()){
String FieldName= fileItem.getFieldName();
//getName()返回的是文件名字普通域没有文件返回NULL
// String Name= fileItem.getName();
String Content= fileItem.getString("gbk");
request.setAttribute(FieldName, Content);
} else{
String nm= fileItem.getName().substring(
fileItem.getName().lastIndexOf("\\")+ 1);
File mkr= new File(path, nm);
if(mkr.createNewFile()){
fileItem.write(mkr);//非常方便的方法
}
request.setAttribute("result","上传文件成功!");
}
}
} catch(Exception e){
e.printStackTrace();
request.setAttribute("result","上传失败,请查找原因,重新再试!");
}
request.getRequestDispatcher("/pages/admin/annex-manager.jsp").forward(
request, response);
}
}
下载(i/o流)无需导包:
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*下载文件
*@author
*
*/
public class DownloadFilesServlet extends HttpServlet{
/**
*
*/
private static final long serialVersionUID= 8594448765428224944L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
doPost(request, response);
}
/*
*处理请求
*(non-Javadoc)
*@see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
String name= request.getParameter("fileName");
System.out.print("dddddddddd:"+ name);
// web绝对路径
String path= request.getSession().getServletContext().getRealPath("/");
String savePath= path+"upload";
//设置为下载application/x-download
response.setContentType("application/x-download");
//即将下载的文件在服务器上的绝对路径
String filenamedownload= savePath+"/"+ name;
//下载文件时显示的文件保存名称
String filenamedisplay= name;
//中文编码转换
filenamedisplay= URLEncoder.encode(filenamedisplay,"UTF-8");
response.addHeader("Content-Disposition","attachment;filename="
+ filenamedisplay);
try{
java.io.OutputStream os= response.getOutputStream();
java.io.FileInputStream fis= new java.io.FileInputStream(
filenamedownload);
byte[] b= new byte[1024];
int i= 0;
while((i= fis.read(b))> 0){
os.write(b, 0, i);
}
fis.close();
os.flush();
os.close();
} catch(Exception e){
}
}
}
二、java怎么用commons-fileupload实现上传文件
文件上传步骤:
1.导入jar包
common-fileupload.jar
common-io.jar
2.上传jsp页面编辑
<body>
<formaction="${pageContext.request.contextPath}/servlet/UploadHandleServlet"enctype="multipart/form-data"method="post">
上传用户:<inputtype="text"name="username"><br/>
上传文件1:<inputtype="file"name="file1"><br/>
上传文件2:<inputtype="file"name="file2"><br/>
<inputtype="submit"value="提交">
</form>
</body>
3.消息提示页面(成功or失败)
<body>
${message}
</body>
4.处理文件上传的servlet编写
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.List;
importjava.util.UUID;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.commons.fileupload.FileItem;
importorg.apache.commons.fileupload.FileUploadBase;
importorg.apache.commons.fileupload.ProgressListener;
importorg.apache.commons.fileupload.disk.DiskFileItemFactory;
importorg.apache.commons.fileupload.servlet.ServletFileUpload;
publicclassUploadHandleServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
StringsavePath=this.getServletContext().getRealPath("/WEB-INF/upload");
//上传时生成的临时文件保存目录
StringtempPath=this.getServletContext().getRealPath("/WEB-INF/temp");
FiletmpFile=newFile(tempPath);
if(!tmpFile.exists()){
//创建临时目录
tmpFile.mkdir();
}
//消息提示
Stringmessage="";
try{
//使用Apache文件上传组件处理文件上传步骤:
//1、创建一个DiskFileItemFactory工厂
DiskFileItemFactoryfactory=newDiskFileItemFactory();
//设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB
//设置上传时生成的临时文件的保存目录
factory.setRepository(tmpFile);
//2、创建一个文件上传解析器
ServletFileUploadupload=newServletFileUpload(factory);
//监听文件上传进度
upload.setProgressListener(newProgressListener(){
publicvoidupdate(longpBytesRead,longpContentLength,intarg2){
System.out.println("文件大小为:"+pContentLength+",当前已处理:"+pBytesRead);
/**
*文件大小为:14608,当前已处理:4096
文件大小为:14608,当前已处理:7367
文件大小为:14608,当前已处理:11419
文件大小为:14608,当前已处理:14608
*/
}
});
//解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");
//3、判断提交上来的数据是否是上传表单的数据
if(!ServletFileUpload.isMultipartContent(request)){
//按照传统方式获取数据
return;
}
//设置上**个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB
upload.setFileSizeMax(1024*1024);
//设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB
upload.setSizeMax(1024*1024*10);
//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>**,每一个FileItem对应一个Form表单的输入项
List<FileItem>list=upload.parseRequest(request);
for(FileItemitem:list){
//如果fileitem中封装的是普通输入项的数据
if(item.isFormField()){
Stringname=item.getFieldName();
//解决普通输入项的数据的中文乱码问题
Stringvalue=item.getString("UTF-8");
//value=newString(value.getBytes("iso8859-1"),"UTF-8");
System.out.println(name+"="+value);
}else{//如果fileitem中封装的是上传文件
//得到上传的文件名称,
Stringfilename=item.getName();
System.out.println(filename);
if(filename==null||filename.trim().equals("")){
continue;
}
//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename=filename.substring(filename.lastIndexOf("\\")+1);
//得到上传文件的扩展名
StringfileExtName=filename.substring(filename.lastIndexOf(".")+1);
//如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
System.out.println("上传的文件的扩展名是:"+fileExtName);
//获取item中的上传文件的输入流
InputStreamin=item.getInputStream();
//得到文件保存的名称
StringsaveFilename=makeFileName(filename);
//得到文件的保存目录
StringrealSavePath=makePath(saveFilename,savePath);
//创建一个文件输出流
FileOutputStreamout=newFileOutputStream(realSavePath+"\\"+saveFilename);
//创建一个缓冲区
bytebuffer[]=newbyte[1024];
//判断输入流中的数据是否已经读完的标识intlen=0;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while((len=in.read(buffer))>0){
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath+"\\"+filename)当中
out.write(buffer,0,len);
}
//关闭输入流
in.close();
//关闭输出流
out.close();//删除处理文件上传时生成的临时文件//item.delete();message="文件上传成功!";
}
}
}catch(FileUploadBase.FileSizeLimitExceededExceptione){
e.printStackTrace();
request.setAttribute("message","单个文件超出最大值!!!");
request.getRequestDispatcher("/message.jsp").forward(request,response);
return;
}catch(FileUploadBase.SizeLimitExceededExceptione){
e.printStackTrace();
request.setAttribute("message","上传文件的总的大小超出限制的最大值!!!");
request.getRequestDispatcher("/message.jsp").forward(request,response);
return;
}catch(Exceptione){
message="文件上传失败!";
e.printStackTrace();
}
request.setAttribute("message",message);
request.getRequestDispatcher("/message.jsp").forward(request,response);
}
privateStringmakeFileName(Stringfilename){//2.jpg
//为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
returnUUID.randomUUID().toString()+"_"+filename;
}
privateStringmakePath(Stringfilename,StringsavePath){
//得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
inthashcode=filename.hashCode();
intdir1=hashcode&0xf;//0--15
intdir2=(hashcode&0xf0)>>4;//0-15
//构造新的保存目录
Stringdir=savePath+"\\"+dir1+"\\"+dir2;//upload\2\3upload\3\5
if(!file.exists()){
file.mkdirs();
}
returndir;
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
5.编写web.xml文件(servlet的映射配置)
<servlet>
<servlet-name>UploadHandleServlet</servlet-name>
<servlet-class>me.gacl.web.controller.UploadHandleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadHandleServlet</servlet-name>
<url-pattern>/servlet/UploadHandleServlet</url-pattern>
</servlet-mapping>
注:网上看到的,出处找不到了,望见谅!!
三、ServletFileUpload.isMultipartContent(request)作用
作用有两个:
1、用于检测是否一个文件上传的请求。在fileupload包实现上传项目前,需要解析一个http请求,为了确保这个请求的确是一个正确的上传文件,所以组件FileUpload提供了这样一个静态的方法。
2、用于判断是普通表单,还是带文件上传的表单,起了辨别的作用。若返回值为true则是带文件上传的表单;返回值为false则是普通表单。
扩展资料
在fileupload中, http请求中的复杂表单元素都会被看作一个FileItem对象,而且FileItem对象必须由ServletFileUpload类中的parseRequest()方法去解析HTTP请求;
再者,ServletFileUpload对象的创建需要依赖于FileItemFactory工厂而获得的上传文件FileItem对象保存至服务器硬盘,也就是指DiskFileItem对象。
参考资料来源:百度百科-fileupload
关于ServletFileUpload,ServletFileUpload.isMultipartContent(request)作用的介绍到此结束,希望对大家有所帮助。