1.Servlet3.0
没有直接获取上传文件名的方法,需要自已创建
public class UploadUtils {
private HttpServletRequest request;
private HttpServletResponse response;
private Part part;
private List<Part> partlist;
public UploadUtils(HttpServletRequest request, HttpServletResponse response){
this.request=request;
this.response=response;
}
//Servlet3.0的处理 手动写获取文件名的方法
public String getSubmitFileName(String name){
String filename=null;
try {
part = request.getPart(name); //得到上传字段的name属性
} catch (IOException | ServletException e) {
e.printStackTrace();
}
String head = part.getHeader("Content-Disposition");
// 截取名字,或者以=分割都可以
// 取到的时第一个f的索引
if (head.lastIndexOf("filename")>-1) { //如果是文件的话
filename = head.substring(head.lastIndexOf("filename=") + 10,
head.length() - 1);
return filename;
}
return filename;
}
//单文件上传
public void upload(String storeFolder,String fileName) throws ServletException, IOException {
// 指定上传的绝对路径
String Dir = request.getServletContext().getRealPath(storeFolder); //WEB-INF/uploads
File Dirfile = new File(Dir);
if (!Dirfile.exists()) { //必须要判断
Dirfile.mkdirs();
}
// 开始上传
try {
if (fileName.length()>0) {
part.write(Dir + File.separator + fileName);
}
} catch (IOException e) {
e.printStackTrace();
}
}
//获取文件名
public List<String> getSubmitFileNames(){
List<String> names= new ArrayList<>();
//这里是需要一步一步紧跟判断的,分开判断会有些问题
try {
partlist=(List<Part>) request.getParts();
} catch (IOException | ServletException e) {
e.printStackTrace();
}
// System.out.println("大小:"+partlist.size());
for (int i = 0; i < partlist.size(); i++) {
String head = partlist.get(i).getHeader("Content-Disposition");
if (head.lastIndexOf("filename")>-1) { //如果是文件的话
String filename = head.substring(head.lastIndexOf("filename=") + 10,
head.length() - 1);
if (head.endsWith("filename=\"\"")) {
partlist.remove(i); //删除空文件的part
i--;
continue;
}
System.out.println("文件名:"+filename);
names.add(filename);
}else{
partlist.remove(i); //删除普通字段的part
i--;
}
}
return names;
}
//多文件上传
public void upload(String storeFolder) throws ServletException, IOException {
// 指定上传的绝对路径
String Dir = request.getServletContext().getRealPath(storeFolder); //WEB-INF/uploads
File Dirfile = new File(Dir);
if (!Dirfile.exists()) { //必须要判断
Dirfile.mkdirs();
}
List<String> filenames= getSubmitFileNames();
System.out.println(filenames);
System.out.println(partlist.size());
// 开始上传
//只要list里面有一个是真正文件对应的part,就可以上传多个
try {
if (filenames!=null &&filenames.size()>0) {
for (int i = 0; i < filenames.size(); i++) {
partlist.get(i).write(Dir + File.separator + filenames.get(i));
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.Servlet3.1 使用
添加了getSubmittedFileName()获取方法名
public class UploadUtils1 {
private HttpServletRequest request;
private HttpServletResponse response;
private Part part;
public UploadUtils1(HttpServletRequest request, HttpServletResponse response){
this.request=request;
this.response=response;
}
//上传单个文件
public void upload(String storeFolder,String fileName) throws ServletException, IOException {
// 指定上传的绝对路径
String Dir = request.getServletContext().getRealPath(storeFolder); //WEB-INF/uploads
File Dirfile = new File(Dir);
if (!Dirfile.exists()) { //必须要判断
Dirfile.mkdirs();
}
// 开始上传
try {
if (fileName!=null) {
part.write(Dir + File.separator + fileName);
}
} catch (IOException e) {
e.printStackTrace();
}
}
//上传多个文件
public void upload(String storeFolder) throws ServletException, IOException {
// 指定上传的绝对路径
String Dir = request.getServletContext().getRealPath(storeFolder); //WEB-INF/uploads
File Dirfile = new File(Dir);
if (!Dirfile.exists()) { //必须要判断
Dirfile.mkdirs();
}
List<String> names=new ArrayList<String>();
// 开始上传
List<Part> partlist=(List<Part>) request.getParts();
for (int i = 0; i < partlist.size(); i++) {
//文件名为null说明是普通字段,文件名为空说明是空上传栏,对应的part上传没有效果
String fileName=partlist.get(i).getSubmittedFileName();
if (fileName!=null && (!"".equals(fileName))) {
names.add(fileName);
}else{
partlist.remove(i);
i--;
}
}
try {
if (names!=null &&names.size()>0) {
for (int i = 0; i < names.size(); i++) {
partlist.get(i).write(Dir + File.separator + names.get(i));
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@WebServlet(urlPatterns="/Upload1")
@MultipartConfig(
location="temp", // 设置文件上传的临时目录
fileSizeThreshold = 1024 // 设置缓存大小
//maxFileSize = 1024 * 1024 * 3, // 设置上传单个文件大小
// maxRequestSize = 1024 * 1024 * 60 // 设置上传总大小
)
public class Test extends HttpServlet{
private static final long serialVersionUID = -1;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");//默认
response.setContentType("text/html;charset=utf-8");
UploadUtils upload=new UploadUtils(request, response);
//得到文件名
// String fileName=upload.getSubmitFileName("upload");
// upload.upload("/WEB-INF/files", fileName);
// upload.upload("/WEB-INF/files");
// response.getWriter().write("文件上传成功!");
UploadUtils1 upload1=new UploadUtils1(request, response);
upload1.upload("/WEB-INF/files");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
jsp页面:
<body>
<form action="Upload1" method="post" enctype="multipart/form-data">
描述:<input type="text" name="filetext"/><br/>
文件1:<input type="file" name="upload" /><br/>
文件2:<input type="file" name="upload" /><br/>
文件3:<input type="file" name="upload" /><br/>
<input type="submit" name="上传"/>
</form>
</body>