第五节 文件上传



从来都不坦荡,情绪都写在脸上;
不开心的时候,不爱说话,笑也勉强。!

输入输出流必须要要会,还有这该死的上传!

--胖先生

一. 关于文件上传

关于上传上传操作,Java Web阶段讲解

1.必须使用表单

2.请求必须是POST

3.enctype="multipart/form-data"

注:enctype="multipart/form-data" 注意虽然我们SpringMVC模拟了PUT,那么如果要做上传操作,那么一定使用POST请求

上传的方式,一共两种方式:

1.commons-fileupload-jar、commons-io.jar

2.Servlet3.0上默认提供上传操作:可以自学一下

二阶段如何完成上传操作的步骤:

1.首先判断该请求是否为上传请求

2.获取上传的服务端的绝对路径

3.判断上传目录是否存在,如果不存在则创建

4.构建磁盘工程

5.创建ServletUpload的类

6.解析请求

7.遍历List<FileItem>

8.判断表单中是普通控件还是上传的文件

如果是上传文件

10.获取上传文件的名称

11.获取上传文件的后缀名

12.创建输入输出流

13.传统方式适应流的操作

14.关闭资源

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.SpringMVC的上传操作的配置


<!-- 关于上传文件的配置,id尽量就叫该名不然有错误 -->

<bean
id="multipartResolver"

class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<!-- 设置上传的编码格式为UTF-8 -->

<property
name="defaultEncoding"
value="UTF-8"/>

<!-- 允许上传的最大文件为10M -->

<property
name="maxUploadSize"
value="10485760"/>

<!-- 设置临时文件夹 -->

<property
name="uploadTempDir" value="temp"/>

<!-- 设置缓存 -->

<property
name="maxInMemorySize"
value="2048"/>

</bean>

2.模拟环境,用户的添加功能,中间包含头像的信息

A.新建表单和上传获取属性测试


<h2>用户添加</h2>

<form
action="add"
method="post"
enctype="multipart/form-data">

<input
type="text"
name="account"
placeholder="账号"><br/>

<input
type="text"
name="password"
readonly="readonly"
value="123456"><br/>

<input
type="text"
name="user_name"
placeholder="姓名"><br/>

<input
type="file"
name="myFile">

<input
type="submit"
value="用户添加操作">

</form>


@RequestMapping(value="/add",method=RequestMethod.POST)

public ModelAndView add(User user

,@RequestParam(name="myFile")MultipartFile file){

System.out.println(user);

System.out.println(file.getContentType());//文件类型

System.out.println(file.getName());//表单文件域 name="myFile"

System.out.println(file.getOriginalFilename());//获取上传文件的名称

System.out.println(file.getSize());//获取文件的大小

return
null;

}


说明

1.需要保存到数据库的信息为上传文件的名称,所有在持久化类里面我们定义的是字符串
类型来保存上传文件的名称
2.需要引用commons-fileupload-1.3.1.jar / commons-io-2.4.jar

3.使用输入输出流的方式,完成上传操作!-->>核心代码:


if(!file.isEmpty()){//1.判断文件是否存在

//2.获取服务端的绝对路径

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

System.out.println("服务器项目的绝对路径-->"+path);

//3.判断该文件夹是否存在,不存在则创建

File folder = new File(path);

if(!folder.isDirectory()){//在文件存在的情况下,才判断是否为文件夹,如果不存在返回的都是false

folder.mkdirs();//创建文件

}

//4.取得上传文件的名称

String fileName = file.getOriginalFilename();

//5.获取上传文件的后缀名

String ext = FilenameUtils.getExtension(fileName);

//6.创建新的文件名称
user.setPhoto(newFileName) 应该保存该名称,存到数据库当中

String newFileName = UUID.randomUUID().toString()+"."+ext;//保证上传文件名称不重复

//7.建立输入输出流

InputStream is = null;

OutputStream os = null;

try {

//8.获取输入流

is = file.getInputStream();

//9.创建文件的输出流

os = new FileOutputStream(path+"/"+newFileName);

//10.输出过程

byte[] b = new
byte[1024];//设置读取的字节缓存

int
length = -1;

while((length=is.read(b))!=-1){//is.read(b)当读不到数据的时候,返回值为 -1

os.write(b, 0, length);

}

} catch (Exception e) {

e.printStackTrace();

}finally {

//11.关闭资源

if(is!=null)is.close();

if(os!=null){

os.flush();

os.close();

}

}

4.SpringMVC内置方法上传 -->>核心代码:


//1.判断该文件是否存在

if(!file.isEmpty()){

//2.获取服务端的绝对路径

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

//3.判断该文件夹是否存在,不存在则创建

File folder = new File(path);

if(!folder.isDirectory()){//在文件存在的情况下,才判断是否为文件夹,如果不存在返回的都是false

folder.mkdirs();

}

//4.取得上传文件的名称

String fileName = file.getOriginalFilename();

//5.获取上传文件的后缀名

String ext = FilenameUtils.getExtension(fileName);

//7.创建新的文件名称有两种方式

//String newFileName = UUID.randomUUID().toString()+"."+ext;

String newFileName = (new Date()).getTime()+"_"+(new Random()).nextInt(10000)+"."+ext;

//8.创建文件

File newFile = new File(path+"/"+newFileName);

//9.上传操作

try {//file形参中的那个文件 newFile自己重新创建的文件

file.transferTo(newFile);

} catch (Exception e) {//以后如果涉及到这里,我们会有另种方式处理

e.printStackTrace();

}

//10.保存新的文件名称

user.setPhoto(newFileName);

}

System.out.println(user);//余下操作为传递USER对象,到Mapper中执行SQL语句

return
null;

4.多文件上传:简单介绍一下


<h2>多文件上传</h2>

<form
action="more1"
method="post"

enctype="multipart/form-data">

<input
type="file"
name="myFile">

<input
type="file"
name="myFile">

<input
type="file"
name="myFile">

<input
type="submit"
value="多文件上传">

</form>


使用数组接收数据

@RequestMapping(value = "/more1", method = RequestMethod.POST)

public ModelAndView add(MultipartFile[]
myFile) {

return
null;

}

5.使用jquery插件完成Ajax文件上传操作

表单:


<%@
page
language="java"
contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<!DOCTYPE HTML>

<html>

<head>

<base href="<%=basePath%>">

<meta
charset="UTF-8">

<title>胖先生:83604162</title>

<!-- 引入JQuery库 -->

<script
type="text/javascript"
src="resource/jquery.js"></script>

<!-- 引入Ajax上传插件 -->

<script
type="text/javascript"
src="resource/jquery.ajaxfileupload.js"></script>

<script
type="text/javascript">

$(function(){

$(‘input[name="myFile"]‘).ajaxfileupload({//绑定Ajax文件上传事件

‘action‘: ‘ajaxUpload‘,//设置访问路径

‘onComplete‘: function(data) {//data为接收服务端返回的文件名称的值

alert(data);

}

});

})

</script>

</head>

<body>

<h2>Ajax上传</h2>

<input
type="file"
name="myFile">

</body>

</html>


服务端代码:

@RequestMapping(value = "/ajaxUpload", method = RequestMethod.POST)

public ModelAndView add(MultipartFile myFile) throws IOException {

// 1.判断该文件是否存在

if (!myFile.isEmpty()) {

// 2.获取服务端的绝对路径

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

System.out.println("服务器项目的绝对路径-->" + path);

// 3.判断该文件夹是否存在,不存在则创建

File folder = new File(path);

if (!folder.isDirectory()) {// 在文件存在的情况下,才判断是否为文件夹,如果不存在返回的都是false

folder.mkdirs();

}

// 4.取得上传文件的名称

String fileName = myFile.getOriginalFilename();

// 5.获取上传文件的后缀名

String ext = FilenameUtils.getExtension(fileName);

// 7.创建新的文件名称

// String newFileName = UUID.randomUUID().toString()+"."+ext;

String newFileName = (new Date()).getTime() + "_" + (new Random()).nextInt(10000) + "." + ext;

// 8.创建文件

File newFile = new File(path + "/" + newFileName);

// 9.上传操作

try {

myFile.transferTo(newFile);

} catch (Exception e) {

e.printStackTrace();

}

// 二阶段传递数据

this.response.setContentType("text/html;charset=UTF-8");

PrintWriter out = this.response.getWriter();

out.write(newFileName);

out.flush();

out.close();

}

return
null;

}


胖先生的微信


感觉该文章对你有所帮助,请点击下方
推荐↓↓↓↓↓↓↓↓↓↓
您的支持是我最大的动力
该资料推荐给四海兴唐的各位同学,希望你们工作顺利,不管何时何地,能帮助你们是胖先生的荣幸!


支付宝,扫一扫

时间: 2024-09-29 08:33:09

第五节 文件上传的相关文章

Struts2(十五)实现文件上传

一.导入包 需要将commons-fileupload和commons-io包和struts包一起导入 实现步骤: 在Jsp页面实现客户端选择上传文件 配置Struts.xml,拦截器会自动接收上传的文件 在Action中实现代码上传文件存入服务器中 跳转至新页面展示上传的文件 二.单个文件上传 上传页面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding=&

【php增删改查实例】第二十四节 - 文件上传在项目中的具体应用

文件上传在项目中,一般有两个用武之地,分别为设置用户的头像和上传附件.本节我们演示如果进行用户头像的上传. 因为一个用户单独并且唯一对应了一个头像,是一对一的关系,所以我们需要去给tm_users表添加一个头像字段 – header . 点击保存按钮,完成表字段的添加. 本节中的头像上传,可以对图像进行裁剪,最终上传到服务器的是一个经过裁剪后的图像. 图像是保存在磁盘上的,数据库只负责保存头像的地址. 现在把 5-10上课资料文件夹中的imageUpload文件夹拷贝到5-10文件夹中. ima

JavaWeb学习总结(五十)——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

SpringMVC学习总结(五)——SpringMVC文件上传例子

这是用的是SpringMVC-3.1.1.commons-fileupload-1.2.2和io-2.0.1 首先是web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/20

JavaWeb学习总结(五十)——文件上传和下载 http://www.cnblogs.com/xdp-gacl/p/4200090.html

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

DVWA 黑客攻防实战(五)文件上传漏洞 File Upload

说起文件上传漏洞 ,可谓是印象深刻.有次公司的网站突然访问不到了,同事去服务器看了一下.所有 webroot 文件夹下的所有文件都被重命名成其他文件,比如 jsp 文件变成 jsp.s ,以致于路径映射不到 jsp 文件,同事怀疑是攻击者上传了个 webshell 文件然后进行批量重命名了. 把后台的代码都找了一遍,后台代码也都有验证文件扩展名的,后面是发现一张普通的照片其实是代码来的,但也不知道为何能够执行.但看完这篇文章你就会明白了. 下面用 dvwa 来演示如何攻击和防御. 低级 用户界面

ASIHTTPRequest系列(三):文件上传

五.文件上传 1.服务端 文件上传需要服务端的配合.我们可在本机搭建tomcat测试环境.关于tomcat在MacOSX下的安装配置,参考作者另一博文<安装Tomcat到Mac OSX>. 打开Eclipse,新建web工程.在其中新建一个ServletUploadServlet: import java.io.*; import java.util.*; importjavax.servlet.ServletException; importjavax.servlet.http.HttpSe

Android文件上传-本地+服务器一条龙分析

本地: 先看下项目结构 MainActivity.java package com.huxq.uploadexample; import java.io.File; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.os.Environment; import

一、虚拟环境.二、路由配置主页与404.三、2.x路由分发.四、伪静态.五、request对象.六、FBV与CBV.七、文件上传.

一.虚拟环境 ''' 解决版本共存 1. 用pycharm选择File点击NewProject然后选择virtualenv创建一个纯净环境 2. 打开下载的目录将venv文件夹下的所有文件(纯净的环境)copy到需要指定长期使用的文件夹下 3. 再次创建项目时,将该环境(指定长期使用的文件夹下Scripts文件夹中的python.exe文件)添加到pycharm环境选择(System Interpreter)中 4. 为该环境添加需要处理的版本共存包 ''' 二.路由配置主页与404 ''' 路