×

ServletFileUpload

前端技术网 前端技术网 发表于2024-01-14 02:39:27 浏览1911 评论0

抢沙发发表评论

一、jsp+servlet实现文件上传与下载源码

上传:

需要导入两个包:commons-fileupload-1.2.1.jar,commons-io-1.4.jar

ServletFileUpload

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;

ServletFileUpload

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)作用的介绍到此结束,希望对大家有所帮助。