JavaWeb实现简单的上传功能
1.导入jar包
commons-fileupload.jar
commons-io.jar
2.代码
界面演示:
点击test下载test.jpg
文件目录
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="Upload" method="post" enctype="multipart/form-data">
学号:<input name="sno" type="text"><br/>
姓名:<input name="sname" type="text"><br/>
上传照片:<input type="file" name="spicture"><br/>
<input type="submit" type="注册"><br/>
</form>
</body>
</html>
UploadServlet
package org.Servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet("/Upload")
public class UploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding( "utf-8" );
resp.setCharacterEncoding( "utf-8" ); //数据传输时候的编码
resp.setContentType( "text/html;charset=UTF-8" ); //响应时候的编码
//上传
try {
boolean isMultipart = ServletFileUpload.isMultipartContent( req ); //检查是否有提交
if (isMultipart) { //判断前台的form是否有mutipart属性
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
diskFileItemFactory.setSizeThreshold( 10240 );//设置上传文件时,用到的临时文件的大小DiskFileItemFactory
ServletFileUpload upload = new ServletFileUpload( diskFileItemFactory );
upload.setSizeMax( 20480 );//这里设置上传文件最大为20kb
//通过parseRequest解析form中的所有请求字段,并保存到items集合中(即前台传递的sno,sname,spicture此时就保存在了items中)
List<FileItem> items = upload.parseRequest( req );
//便利items中的数据(sno,sname,spicture)
Iterator<FileItem> iter=items.iterator();
while(iter.hasNext()){
FileItem item=iter.next();
String itemName=item.getFieldName();
int sno=-1;
String sname=null;
//判断前台字段,是普通form表单字段,还是文件字段
if(item.isFormField()){
if(itemName.equals( "sno" )){//根据name属性,判断item是sno还是sname
sno= Integer.parseInt( item.getString("utf-8") );
}else if(itemName.equals( "sname" )){
sname=item.getString("utf-8");
}else {
System.out.println( "其他字段" );
}
}else{//spicture
//文件 上传
//文件名:getFieldName是获取普通表单字段的Name的值,而getName是获取文件名
String fileName=item.getName();
//判断文件格式是否是照片
String ext=fileName.substring( fileName.indexOf( "." )+1 );
if(!(ext.equals( "png" )||ext.equals( "gif" )||ext.equals( "jpg" ))){
System.out.println( "图片格式错误" );
return ;
}
String path="D:\\my bug\\ideal\\UploadAndDownload\\file";
System.out.println( path );
File file=new File(path,fileName );
//获取文件内容并上传
item.write(file);
System.out.println(fileName+"上传成功" );
return ;
}
}
}
}
catch (FileUploadBase.SizeLimitExceededException e){//SizeLimitExceededException是FileUploadException的子类
System.out.println( "文件大小过大,最大20kb" );
}
catch (FileUploadException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet( req,resp );
}
}
DownLoadServlet
package org.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
@WebServlet("/DownLoadServlet")
public class DownLoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding( "utf-8" );
//获取文件名,这里的filename包含了后缀
String filename=req.getParameter( "filename" );
//下载文件:需要设置消息头
resp.addHeader( "content-Type","application/octet-stream" );//MIME类型:二进制文件
resp.addHeader( "content-Disposition","attachment;filename="+ URLEncoder.encode(filename,"UTF-8"));
//Servlet通过文件的地址,将文件转为输入流,读取到Servlet中
InputStream inputStream=getServletContext().getResourceAsStream( "/res/"+filename );
//通过输出流将刚才已经转为输入流的文件,输出给用户
ServletOutputStream outputStream=resp.getOutputStream();
byte[] bs=new byte[10];
int len=-1;
while((len=inputStream.read(bs))!=-1){
outputStream.write( bs,0,len );
}
outputStream.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet( req,resp );
}
}