文件上传和下载
Posted Vodka~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件上传和下载相关的知识,希望对你有一定的参考价值。
1.完整的文件上传:前台发送文件,后台接收并保存文件。
2.前端: - 在文件上传时,上传文件的界面主要由表单界面组成,表单的请求方式为:POST;
-form 表单的 enctype 必须设置为 “multipart/form-data”,即 enctype=“multipart/form-data”,
作用是设置表单的类型为文件上传表单。
-默认情况下表单类型为: “application/x-www-urlencoded”,不能用于文件上传。只有使用了multipart/form-data才能完整地传递文件数据。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<!--
1.设置表单提交方法为: method="post"
2.设置表单类型为(文件上传表单):enctype="multipart/form-data"
3.设置接收表单内容的地址(action)
4.设置表单元素:
-普通表单项 type="text"
-文件项 type="file"
5.设置表单元素的name值(后端接收数据的辨别依据)
-->
<form enctype="multipart/form-data" method="post" action="UploadServer">
项目:<input type="text" name="Item"> <br>
文件上传: <input type="file" name="ItmeFiles"> <br>
<!-- button的默认类型是提交类型 type="submit" -->
<button type="submit">提交</button>
</form>
</body>
</html>
package com.StartSL;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
/**
* @author Vodka
* @date 2021/08//11:13
*/
//必须使用注解 @MultipartConfig 将一个Servlet标示为支持文件上传,
// Servlet 将multipart/form-data 的post请求封装成Part,再通过Part进行文件相关操作
@WebServlet(urlPatterns = {"/UploadServer"})
@MultipartConfig
public class UploadFile extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res){
// 设置请求的编码格式
try {
req.setCharacterEncoding("UTF-8");
// 获取普通表单项 (文本框)
String Item = req.getParameter("Item");
System.out.println("项目名称:"+Item);
// 通过 getPart(name); 获取Part对象 (name代表页面中file文件域的name属性值)
Part part = req.getPart("ItemFiles");
// 通过Part对象,获取上传文件名
String fileName = part.getSubmittedFileName();
System.out.println("上传的文件名称:"+fileName);
// 获取上传文件需要存放的路径(真实路径)
String realPath = req.getServletContext().getRealPath("/");
System.out.println("项目存放的路径:" + realPath);
// 将文件上传到指定位置
part.write(realPath + "/" + fileName);
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.文件下载:将服务器上的资源下载(拷贝)到本地,可以通过两种方式下载:
-超链接本身的特性来下载
-通过代码下载
4.超链接下载: 当html或jsp页面中使用(超链接)a标签时,当超链接遇到浏览器不能识别的资源会自动下载;
当浏览器遇见能够直接显示的资源,会默认显示出来,比如txt,png,jpg等。
<!--当超链接遇到浏览器不识别的资源时,会自动下载-->
<a href="test.zip">超链接下载</a>
<!--
当超链接遇到浏览器识别的资源,默认不会下载,可以通过指定download属性下载,
download属性可以不写任何信息,会自动使用默认文件名,若设置了download属性的值,则使用设置的值作为文件名
-->
<a href="test.txt" download>指定download下载</a>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<!-- 浏览器能识别的资源,点击之后能在浏览器呈现-->
<a href="download/vodka.txt">文件资源</a>
<a href="download/img2.jpg">图片资源</a>
<!--浏览器不能识别的资源,点击链接之后则自动下载-->
<a href="download/commute.zip">压缩资源</a>
<!--设置了download属性(下载的文件的名称),则不管浏览器能不能识别,点击之后则会直接下载资源-->
<a href="download/img2.jpg" download="猫咪.jpg">点击下载</a>
</body>
</html>
<form method="get" action="One">
文件名:<input type="text" name="FileName" placeholder="请输入要下载的文件名">
<button >下载</button>
package com.StartSL;
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.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
/**
* @author Vodka
* @date 2021/08//11:27
*/
/*
* 后台实现下载:
* 1.通过response.setContentType 方法设置 Content-type 头字段的值为浏览器无法使用某种方式或
* 激活某个程序来处理的 MIME类型,例如 “application/octet-stream”或“application/x-msdownload”等
* 2.通过response.setHeader 方法设置 Content-Disposition 头的值为"attachment;filename=文件名"
* 3.读取下载文件,调用response.getOutputStream 方法向客户端写入附件内容。
* */
@WebServlet("/One")
public class LoadInBack extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res){
System.out.println("请求下载");
// 设置请求编码
try {
req.setCharacterEncoding("UTF-8");
res.setContentType("text/html;charset=utf-8");
// 设置文件下载路径
String Path = getServletContext().getRealPath("/download/");
// 获取要下载的文件名
String Name = req.getParameter("FileName");
// 通过路径得到file对象
File filePath = new File(Path + Name);
// 判断file对象是否存在,并且是否符合标准文件格式
if(filePath.exists() && filePath.isFile()){
// 设置响应类型(该类型为浏览器无法使用某种方式或激活某个程序来处理的类型)
res.setContentType("application/x-msdownload");
// 设置头信息
res.setHeader("Content-Disposition","attachment;filename="+Name);
// 得到输入流
InputStream is = new FileInputStream(filePath);
// 得到输出流
ServletOutputStream os = res.getOutputStream();
// 定义byte数组
byte[] Filecar = new byte[1024];
int length = 0 ;
// 将输入流的数据循环输出到输出流
while((length = is.read(Filecar)) != -1){
os.write(Filecar,0,length); //每装满一次Filecar都输出到输出流中
}
// 关闭流 释放资源
os.close();
is.close();
}else{
res.getWriter().write("请输入要下载的文件名!");
res.getWriter().close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上是关于文件上传和下载的主要内容,如果未能解决你的问题,请参考以下文章