本文主要关于利用html表单上传文件的后台代码实现。
需要用到两个工具类Apache commons-fileupload和commons-io。
注意要校验是否选择文件上传,最开始写的时候没有加上校验,没有选择文件,提交表单后一直报异常。
当然也可以在前台加上js判断是否选择文件
前台页面代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传</title>
</head>
<body>
 
<form action="${pageContext.request.contextPath }/UploadServlet" method="post" enctype="multipart/form-data">
<input type="text" name="username">
<input type="file" name="upload">
<input type="submit" value="提交">
</form>
 
 
</body>
</html>
后台Java Servlet代码
 
package demo;
 
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
 
 
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
 
 
public class UploadServlet extends HttpServlet {
 
 
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//1、创建磁盘文件项工厂
//获取web根目录下放置缓存文件的文件夹“temp”的物理路径
String path_temp = this.getServletContext().getRealPath("temp");
File file =  new File(path_temp) ;
DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024, file);//1024*1024为设置文件缓存大小
//也可以new一个空参的factory,随后再设置缓存大小,和缓存位置
//DiskFileItemFactory factory = new DiskFileItemFactory();
//factory.setSizeThreshold(1024*1024);
//factory.setRepository(file);
//2、创建文件上传的核心类
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件名称的编码为UTF-8,不设置有可能会出现中文乱码,编码规范要进行设置。
upload.setHeaderEncoding("UTF-8");
//判断表单是否是文件上传表单,只是为了演示需要,实际开发中开发人员肯定知道这是不是文件上传表单
boolean multipartContent = upload.isMultipartContent(request);
if(multipartContent) {
//是文件上传的表单,解析request获得文件项集合
List<FileItem> parseRequest = upload.parseRequest(request);
if(parseRequest!=null) {
for(FileItem item :parseRequest) {
//判断是不是普通表单项
boolean formField = item.isFormField();
if(formField) {
//如果是普通表单项
String fieldName = item.getFieldName();
String fieldValue = item.getString("UTF-8");//对普通表单项的内容进行编码
//当表单是enctype="multipart/form-data"时,request.getParameter相关的方法都失效,所以要用上面的方法获得值
//String parameter = request.getParameter("username");//获取不到,失效!
System.out.println("表单值为:"+fieldName+"="+fieldValue);
}else {
//如果是文件上传项
String name = item.getName();
System.out.println("文件名为:"+name);
System.out.println(item);
//加入判断文件是否上传,如果不加判断,前台没有选择文件,提交后会报IO空指针异常
if(item.getSize()==0L) {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("请上传文件");
return;
}
if(name=="") {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("文件名不能为空");
return;
}
InputStream in = item.getInputStream();
String path_store = this.getServletContext().getRealPath("upload");
OutputStream out = new FileOutputStream(path_store+"/"+name);
IOUtils.copy(in, out);
in.close();
out.close();
//删除临时文件
item.delete();
}
}
}
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("是文件上传");
}else {
//不是文件上传表单,可以使用原始的获取表单数据方式request.getParameter();
//只是为了演示需要,实际开发中开发人员肯定知道这是不是文件上传表单
Map<String, String[]> parameterMap = request.getParameterMap();
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("不是文件上传表单");
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
 
 
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
版权声明:本文为CSDN博主「WenJie1024」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/javae100/article/details/79938923

javaweb大文件上传的更多相关文章

  1. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  2. java 大文件上传 断点续传 完整版实例 (Socket、IO流)

    ava两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路: 1.服:利用ServerSocket搭建服务器,开启相应端口,进行长连接操 ...

  3. JavaWeb实现文件上传下载功能实例解析 (好用)

    转: JavaWeb实现文件上传下载功能实例解析 转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web ...

  4. 解决PHP大文件上传问题

    PHP大文件上传问题    今天负责创业计划大赛的老师问我作品上报系统上传不了大文件,我当时纳闷了,做的时候没限制上传文件的大小阿,怎么会传不了呢,自己亲自体验了番,果然不 行,想了好一会儿才有点眉目 ...

  5. JavaWeb:实现文件上传

    JavaWeb:实现文件上传 理解文件上传: 1.上传文件就是把客户端的文件发送给服务器端. 2.HTTP响应的正文部分最常见的是HTML文档,但是也可以是其他任意格式的数据,如图片和声音文件中的数据 ...

  6. 使用commons-fileupload包进行大文件上传注意事项

    项目中使用 commons-fileupload-1.2.1.jar 进行大文件上传. 测试了一把,效果很不错. 总结如下: 必须设置好上传文件的最大阀值 final long MAX_SIZE = ...

  7. 因用了NeatUpload大文件上传控件而导致Nonfile portion > 4194304 bytes错误的解决方法

    今天遇到一个问题,就是“NeatUpload大文件上传控件而导致Nonfile portion > 4194304 bytes错误”,百度后发现了一个解决方法,跟大家分享下: NeatUploa ...

  8. ASP.NET 大文件上传的简单处理

    在 ASP.NET 开发的过程中,文件上传往往使用自带的 FileUpload 控件,可是用过的人都知道,这个控件的局限性十分大,最大的问题就在于上传大文件时让开发者尤为的头疼,而且,上传时无法方便的 ...

  9. 【原创】用JAVA实现大文件上传及显示进度信息

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

随机推荐

  1. 08_Azkaban案例实践1_Command单一job示例

    1.Azkaban实战 Azkaba内置的任务类型支持command.java 2.Command类型单一job示例 1.创建job描述文件:vi command.job #command.job t ...

  2. c线程使用锁控制并发

    // // Created by gxf on 2019/12/16. // #include <stdlib.h> #include <stdio.h> #include & ...

  3. JDK源码那些事儿之红黑树基础上篇

    说到HashMap,就一定要说到红黑树,红黑树作为一种自平衡二叉查找树,是一种用途较广的数据结构,在jdk1.8中使用红黑树提升HashMap的性能,今天就来说一说红黑树. 前言 限于篇幅,本文只对红 ...

  4. Selenium(五)鼠标和键盘事件

    1.模拟鼠标找到大分类下的子分类.以网易严选为例. 如果直接找到  坚果炒货 这个元素,然后点击它来实现跳转,是会报错的. 模拟鼠标停留--点击行为:  页面已成功跳转 2.键盘事件 模拟搜索操作: ...

  5. Python 10--模块

    可以在模块中,直接使用__file__,识别出该模块文件的路径. print __file__  

  6. mouseout([[data],fn])

    mouseout([[data],fn]) 概述 当鼠标指针从元素上移开时,发生 mouseout 事件. 该事件大多数时候会与 mouseover 事件一起使用.深圳dd马达 注释:与 mousel ...

  7. sql server 的 out 和output

    sql中out与output   --SQLQuery Create By Faywool         create proc Proc_OutPutTest--创建 @numA int,--nu ...

  8. git 远程代码被覆盖

    场景: 解决方法: 第1步. 回退至上一个完整的正确的版本.Git Bash 中输入命令: git reset --hard 1b59cef2a1685c37b7e7b5f2497e055f5e031 ...

  9. js批量下载文件

    ​关于兼容性问题:   <a href="xxx.docx" target='_blank'></a>   下载文件时,这种写法是没有兼容性问题:但是下载图 ...

  10. CF350E Wrong Floyd

    洛谷题目链接 前言: 这题其实真的不难 回归正题: 我们首先要明白$floyd$的思想,相信你都来做这道水题了,肯定不陌生,简单的手玩后,我们可以发现: 只要有任意一个点只跟非标记点相连的话,是更新不 ...