java web 文件上传工具类_JavaWeb中实现文件上传的方式有哪些?

上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些。

文件上传的方式Servlet2.5 方式

Servlet3.0 方式

SpringMVC 方式

案例实操

Servlet2.5 方式

文件上传涉及到前台页面的编写和后台服务器端代码的编写,前台发送文件,后台接收并保存文件,这才是一个完整的文件上传。

1) 前台页面

在做文件上传的时候,会有一个上传文件的界面,首先我们需要一个表单,并且表单的请求方式为 POST;其次我们的 form 表单的 enctype 必须设为”multipart/form-data”即 enctype="multipart/form-data" 意思是设置表单的 MIME 编码。默认情况下这个编码格式是 ”application/x-www-form-urlencoded”,不能用于文件上传;只有使用了 multipart/form-data 才能完整地传递文件数据。

上传文件

文件:

2) 后台 commons-fileupload 的使用

首先需要导入第三方jar包,http://commons.apache.org/  下载 commons-io 和 commons-fileupload 两个jar的资源。解压并导入到项目中。commons-fileupload.jar 是文件上传的核心包 commons-io.jar 是 fileupload 的依赖包,同时又是一个工具包。e4519e3aef3e543cb6ee69fd35a4eeba.png

介绍一下使用到的几个核心类

DiskFileItemFactory – 设置磁盘空间,保存临时文件。只是一个工具类

ServletFileUpload – 文件上传的核心类,此类接收 request,并解析

ServletFileUpload.parseRequest(request); – List 解析 request

1、创建一个 DiskFileItemFactory 工厂类,并制定临时文件和大小

2、创建 ServletFileUpload 核心类,接收临时文件,做请求的转换

3、通过 ServletFileUpload 类转换原始请求,得到 FileItem 集合

4、遍历集合中的各个元素并处理

5、判断每个元素是否是普通表单项,如果是则按照普通表单项处理

6、如果不是普通表单项,则是文件,通过处理的方式进行处理(上传)

public class UploadServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 设定编码,可以获取中文文件名

request.setCharacterEncoding("UTF-8");

// 获取tomcat下的upload目录的路径

String path = getServletContext().getRealPath("/upload");

// 临时文件目录

String tempPath = getServletContext().getRealPath("/temp");

// 检查我们是否有文件上传请求

// boolean isMultipart = ServletFileUpload.isMultipartContent(req);

// 1、声明DiskFileItemFactory工厂类,用于在指定磁盘上设置一个临时目录

DiskFileItemFactory disk = new DiskFileItemFactory(1024 * 10, new File(tempPath));

// 2、声明ServletFileUpload,接收上面的临时文件。也可以默认值

ServletFileUpload up = new ServletFileUpload(disk);

// 3、解析request

try {

List list = up.parseRequest(request);

if (list.size() > 0) {

for (FileItem file : list) {

// 判断是否是普通的表单项

if (file.isFormField()) {

String fieldName = file.getFieldName();

// 中文乱码,此时还需要指定获取数据的编码方式

// String value = file.getString();

String value = file.getString("UTF-8");

System.out.println(fieldName + "=" + value);

} else { // 说明是一个文件

// 获取文件本身的名称

String fileName = file.getName();

System.out.println(file.getFieldName());

// 处理文件名称

fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);

System.out.println("old Name : " + fileName);

// 修改名称

String extName = fileName.substring(fileName.lastIndexOf("."));

String newName = UUID.randomUUID().toString().replace("-", "") + extName;

// 保存新的名称,并写出到新文件中

file.write(new File(path + "/" + newName));

System.out.println("文件名是:" + fileName);

System.out.println("文件大小是:" + file.getSize());

file.delete();

}

}

}

} catch (FileUploadException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

}

}

Servlet3.0 方式

使用注解 @MultipartConfig 将一个 Servlet 标识为支持文件上传。Servlet3.0 将 multipart/form-data 的 POST 请求封装成 Part,通过 Part 对上传的文件进行操作。

前台

上传文件

姓名:

文件:

后台

@WebServlet("/upload")

@MultipartConfig

public class UploadServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("上传文件...");

// 设置编码

request.setCharacterEncoding("UTF-8");

// 获取普通表单项参数

String uname = request.getParameter("uname");

System.out.println(uname);

// 上传文件

// 得到part对象 request.getpart(name):name代表的是表单中file元素的name属性值

Part part = request.getPart("myfile");

// 得到文件存放的路径

String path = request.getServletContext().getRealPath("/");

// 得到文件名

String fileName = part.getSubmittedFileName();

// 上传

part.write(path + fileName);

}

}

SpringMVC 方式

Pom 文件修改 添加 commons-fileupload 依赖

commons-fileupload

commons-fileupload

1.3.2

servlet-context.xml

104857600

4096

FileController

import java.io.File;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.multipart.MultipartFile;

import org.springframework.web.multipart.MultipartHttpServletRequest;

import org.springframework.web.servlet.ModelAndView;

@Controller

public class FileController {

@RequestMapping("/uploadFile")

public ModelAndView uploadFile(HttpServletRequest request){

ModelAndView mv=new ModelAndView();

mv.setViewName("result");

MultipartHttpServletRequest mr=(MultipartHttpServletRequest) request;

MultipartFile multipartFile= mr.getFile("file");

String path=request.getSession().getServletContext().getRealPath("upload");

System.out.println(path);

if(null!=multipartFile&&!multipartFile.isEmpty()){

String fileName=multipartFile.getOriginalFilename();

try {

multipartFile.transferTo(new File(path,fileName));

mv.addObject("msg", "文件上传成功!");

} catch (Exception e) {

mv.addObject("msg", "上传失败!");

e.printStackTrace();

}

}

return mv;

}

}

前台表单

提交

扩展~MIME

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

它是一个互联网标准,扩展了电子邮件标准,使其能够支持:

非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)。

这个标准被定义在RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049等RFC中。 MIME改善了由RFC 822转变而来的RFC 2822,这些旧标准规定电子邮件标准并不允许在邮件消息中使用7位ASCII字符集以外的字符。正因如此,一些非英语字符消息和二进制文件,图像,声音等非文字消息原本都不能在电子邮件中传输(MIME可以)。MIME规定了用于表示各种各样的数据类型的符号化方法。 此外,在万维网中使用的HTTP协议中也使用了MIME的框架,标准被扩展为互联网媒体类型。

查看不同文件对应的 MIME 类型,推荐大家一种方式,以 Tomcat为例,它下面的 web.xml 文件可以查看所有的MIME类型,通过 Ctrl + F 搜索快速找到你想知道的文件对应的 MIME 类型。94a850e1d7f54e55bdd6d31b576c8e21.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos上如何装python_centos如何安装Python3

摘自:https://www.cnblogs.com/Mr-wangxd/p/7028285.htmlLinux下默认系统自带python2.6的版本,这个版本被系统很多程序所依赖,所以不建议删除,如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的&…

java 字节输出流_Java IO详解(三)------字节输入输出流

那么这篇博客我们讲的是字节输入输出流:InputStream、OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam、FileOutStream)1、字节输出流:OutputStreampublic abstract class OutputStreamextends Objectimplements C…

java 缩略图 库_Thumbnailator:一个高质量Java缩略图开发库

February 24, 2020: Thumbnailator 0.4.11 has been released! See Changes for details.Thumbnailator is now available through Maven!What is Thumbnailator?Thumbnailator is a thumbnail generation library for Java.Why Thumbnailator?Making high-quality thumbnail…

java数据段 静态区_回顾一下基础,关于栈与堆,常量池,静态区

先来张简单的图:1.jpg------------------分割------------------------栈内存:1.操作比较快速.但是为私有.2.线程之间不共享.所以存放一些基本数据类型,局部变量(方法走完就回收了),3.对于引用数据类型的地址引用.堆内存:1.new出来的实例2.成员变量的值(如果是基本数据类型,比如…

java项目如何更改路径_Java修改eclipse中web项目的server部署路径问题

和MyEclipse不一样,在Eclipse中做的Web项目默认是不支持将项目发布到Web服务器上的,会发布到工作空间的某个目录,因此无法在外部启动Tomcat来运行Web项目,只有打开Eclipse中的服务器,才能运行Web项目。所以要对Eclipse…

java xpdf 转换成html_java将Word/Excel/PDF文件转换成HTML整理

项目开发过程中,需求涉及到了各种文档转换为HTML或者网页易显示格式,现在将实现方式整理如下:一、使用Jacob转换Word,Excel为HTML“JACOB一个Java-COM中间件.通过这个组件你可以在Java应用程序中调用COM组件和Win32 libraries。”首先下载Jac…

mysql 出现 quot_MYSQL 新版出现 Client does_mysql _ 搞代码

mysql 帮助:A.2.3 Client does not support authentication protocolMySQL 4.1 and up uses an authentication protocol based on a password hashing algorithm that is incompatible with that used by older clients. If you upgrade the server to 4.1, attemp…

Java可移动性不强_java地位无可撼动的原因

如今,面对曾经在程序员中被各种新技术掩盖直至堙灭的技术值得怀念。犹如COBOL这当年被老程序员们尊为神器的语言如今也基本没有价值。而Java作为现代程序员的中坚力量在这点上会不会成为下一个COBOL?有关JAVA的技术卖出多少本书已经是一个很久远的记忆了…

php数据回显是什么意思,jquery回显是什么意思

首先来看一下回显是什么意思?在数据提交出现错误的时候, 已填写的信息仍在文本框中, 比如用户登录, 当用户输入错误的密码之后, 用户名仍在文本框, 只是密码框清空。对于一些要填写很多信息的表单, 如果因为一些错误导致已经填写的整个表单信息重新填写, 对于用户非…

Java摩托车汽车轮胎数量,摩托车轮子上的知识,你知道多少?

原标题:摩托车轮子上的知识,你知道多少?摩托车轮子好比人的两条腿,决定了车子跑得远,跑得快和跑得是否安稳。摩友们似乎对轮子的关心不多,因为它是易损件,概念中轮子轮胎出了问题,随便找路边的“风火补胎”…

php配置文件加盐解密,PHP实现支持加盐的图片加密解密

一个简单的图片加解密函数&#xff0c;使用client跑&#xff0c;不要使用浏览器跑话不多说&#xff0c;直接上代码/*** Created by hello.* User: qq 845875470* Date: 2016/4/2* Time: 11:21*/$notice <<为了稳定性&#xff0c;必须在客户端跑格式 &#xff1a;php pat…

Oracle导入dmp文件报12504,ORA-12504:TNS :监听程序在 CONNECT_DATA 中未获得SERVICE_NAME...

使用本地的SQLPlus连接服务器上的Oracle数据库&#xff0c;这是由于本地有安装了Oracle数据库服务&#xff0c;所以才会系统先提示&#xff1a;ORA-12504:TNS: 监听程序在 CONNECT_DATA 中未获得 SERVICE_NAME再次输入用户名密码系统又提示&#xff1a;ORA-12560: TNS: 协议适配…

linux+有趣的指令,6个有趣的Linux命令(乐趣终端) - 第二部分

在我们过去的以下文章中&#xff0c;我们展示了一些关于Linux的有趣命令的有用文章&#xff0c;这表明Linux并不像看起来那么复杂&#xff0c;如果我们知道如何使用它&#xff0c;就会很有趣。 Linux命令行可以非常容易地完成任何复杂的任务&#xff0c;可以有趣和快乐。有趣的…

dvwa安装包linux,dvwa安裝、配置、使用教程(Linux)

一、搭建LAMP環境二、安裝DVWA2.1 下載dvwa2.2 解壓安裝將下載的應用解壓到apache默認的主目錄/var/www/html&#xff1a;unzip DVWA-master.zip -d /usr/www/html2.3 啟用功能dvwa上的漏洞&#xff0c;需要些刻意的配置才能被利用。訪問&#xff1a;http://172.0.0.2/dvwa如下…

八数码c语言编程深度搜索,广度优先搜索解 八数码, 求意见, 求bug/

已结贴√问题点数&#xff1a;100 回复次数&#xff1a;31广度优先搜索解 , 求意见&#xff0c; 求bug/我得去买票了&#xff0c;....#include #include #include #define NUM 5typedef struct bgMatrix{int v, w;char matrix[NUM][NUM];int pre;}Matrix;typedef struct bgQueu…

linux定时任务每两天执行,Linux定时任务 crontab每秒执行 实现2种方法

linux crontab 命令&#xff0c;最小的执行时间是一分钟&#xff0c; 如果要在小于一分钟执行。就要换个方法来实现&#xff0c;下面分别以两种方法来实现&#xff1a;tolog.phpfile_put_contents(/home/fujieace/php/crontab/run.log, date(Y-m-d H:i:s)."\r\n", FI…

C语言中的标识符以字母或下划线开头,牛逼大神整理的C语言基础知识,你确定你不码下来?...

【【怪兽爱C语言】牛逼大神整理的C语言基础知识&#xff0c;你确定你不码下来&#xff1f;】https://toutiao.com/group/6577344220355363341/?iid15906422033&appexplore_article&timestamp1531501720&tt_fromcopy_link&utm_sourcecopy_link&utm_mediumt…

c语言switch同时比较多个变量,C语言学习if和switch分支选择结构

如何判断一个整数是否为正数计算机同我们一样&#xff0c;也是可以判断大小。在此之前&#xff0c;我们需要先说明在计算机中用来判断两个数关系的符号&#xff0c;即关系运算符。关系运算符号c语言中的关系运算符与数学上学习的有什么不同&#xff1f;image.png关系表达式的值…

c语言字符串升序输出,编写程序将已按升序排好的两个字符串a和b中的字符按升序归并到字符串c中,最后输出”abcdefghijklmnpq”。...

满意答案sjoest2014.08.18采纳率&#xff1a;59% 等级&#xff1a;8已帮助&#xff1a;663人(1)char a[]"acegikm"; a数组没有赋予数组大小&#xff0c;所以它的大小&#xff0c;默认等于赋予的字符串长度等于7&#xff0c;所以当strcat(a,b)时&#xff0c;…

c语言指针化简带分数,c语言带分数四则运算问题!!!要求被调函数,化简.

满意答案Lie囡2013.02.03采纳率&#xff1a;58% 等级&#xff1a;12已帮助&#xff1a;8948人#include long int a,b,c,d,x,y,z;char op;int f1();int f2();main(){printf("shu ru di yi ge shu de fen zi:");scanf("%ld",&a);printf("shu ru …