文件上传与下载在项目中运用的使用频率很大 今天也花时间整理了一下 多文件上传图片回显 和文件下载

 1.多文件上传

这里会涉及到几个属性

fileSizeThreshold:缓冲区文件的大小 如果上传的文件的超过了缓冲区的值 那么就会生成一个临时文件存放到指定目录中 缓冲区的大小默认是10KB
maxFileSize:单个文件上传的大小
maxRequestSize :总共上传文件的最大值 
location:文件上传的位置

注意一点当我们上传了多个文件名相同的文件时 上传的文件会覆盖掉前面上传的文件 但是可能只是文件名相同文件的内容不同 这时该怎么办呢?
这里提供了两种方法
第一种方法 我们可以在输出流中添加系统时间 以为每次我上传文件的时候时间是不同的
第二种方法
还可以使用java中提供的UUID通用唯一识别码 UUID是唯一的
  String uuid = UUID.randomUUID().toString();
package com.newroad.upload;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.UUID;
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;
@WebServlet("/upload02.do")
@MultipartConfig
/*@MultipartConfig(fileSizeThreshold=1024*50,location="d:/test1",maxFileSize=1024*1024,maxRequestSize=1024*1024)*/
@SuppressWarnings("serial")
public class UpLoadServlet2 extends HttpServlet{ @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得所有的前台传递的数据部分,包含文件,包含文本
Collection<Part> parts = request.getParts();
//遍历集合
for(Part part : parts) {
if(!part.getName().equals("file")) {
continue ;
}
//获得这个文件的名称
String fileName = part.getSubmittedFileName();
//将文件保存到指定的位置 我们约定的位置在 webapp/upload/ch10_01
String realpath = request.getServletContext().getRealPath("");
//获得webapp的真实路径
File webappPath = new File(realpath).getParentFile();
//获得约定的路径的File对象
File uploadDi = new File(webappPath,"upload"+request.getContextPath());
//为了避免首次上传,文件夹找不到 创建文件夹
uploadDi.mkdirs();
//创建UUID
String uuid = UUID.randomUUID().toString();
System.out.println(uuid);
FileOutputStream out = new FileOutputStream(new File(uploadDi,System.currentTimeMillis()+"_"+fileName));
//获取输入流
InputStream in = part.getInputStream();
//创建缓冲区
byte[] b = new byte[1024];
int num=0 ;
//循环将输入流中的数据读到缓冲区中
while((num=in.read(b))!=-1) {
out.write(b, 0, num);
}
in.close();
out.close();
}
//响应上传结果
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8"); PrintWriter writer = response.getWriter();
writer.write("上传成功");
writer.close(); } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}

2.图片上传以及回显

经常我们会看到当我们在qq或者其他软件中上传图片的时候 就会把上传的图片显示出来 接下来来实现这个功能

注意以下

 contentType : false 必须是false,才能够被设置正确的内容类型
 processData : false 告诉jquery不要对数据做处理,如果不设置,那么jquery会按照它的规则对数据进行处理 
 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ request.getContextPath() + "/";
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<base href="<%=basePath%>">
<title>使用ajax上传图片后,回显至页面</title>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
$(function() {
$("input[type=submit]").on("click", function() {
//阻滞默认提交时间
event.preventDefault();
//数据需要使用到FormData这个对象,将表单中的数据封装到FormData对象中
//获得表单对象,不能使用jquery的方式,必须使用原生js来获取
var form = document.getElementById("p1");
var formData = new FormData(form);
$.ajax({
url : "upload03.do",
data : formData,
type : "POST",
//必须是false,才能够被设置正确的内容类型
contentType : false,
//告诉jquery不要对数据做处理,如果不设置,那么jquery会按照它的规则对数据进行处理
processData : false,
//设置上传成功之后 回显图片
success : function(data) {
if (data.path) {
$("#p1").css("display", "inline");
$("#p1").attr("src", "../" + data.path);
} } }) }) })
</script>
<style type="text/css">
#p1 {
width: 200px;
display: none;
height: 200px;
}
</style>
</head>
<body>
<form id="ff">
<input type="file" name="file" accept="image/jpeg,image/png,image/gif"><br>
<input type="submit" value="准备上传">
<img id="p1">
</form>
</body>
</html>

图片上传回显其实就是将 图片上传成功后将拿到图片的地址 然后 通过ajax拿到图片的地址 并设置图片的显示方式

 package com.newroad.upload;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
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 com.alibaba.fastjson.JSONObject; @WebServlet("/upload03.do")
@MultipartConfig
@SuppressWarnings("serial")
public class UpLoadServlet3 extends HttpServlet { @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取上传的文件 通过input标签中的name属性值获得相应的Part对象
Part part = request.getPart("file");
//获取文件名称
String fileName =part.getSubmittedFileName();
//获得tomcat的目录
String realPath =request.getServletContext().getRealPath("");
File parentFile = new File(realPath).getParentFile();
File uploadDi = new File(parentFile,"upload"+request.getContextPath());
//创建文件夹
uploadDi.mkdirs();
//将文件写出到硬盘中
FileOutputStream out = new FileOutputStream(new File(uploadDi,fileName));
//获得输入流
InputStream in = part.getInputStream();
//创建一个缓冲区
byte[] b = new byte[1024*3];
//判断输入流中的数据读完的标志
int num = 0 ;
//循环将输入流中的数据读取到缓冲区中 判断读完的标志是num=in.read(b)>0
while((num=in.read(b)) !=-1) {
//将缓冲区的数据写到指定的目录中
out.write(b, 0, num);
}
out.close();
in.close(); //响应信息
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
PrintWriter writer = response.getWriter();
//将图片地址响应给前端
String path = "upload"+request.getContextPath()+"/"+fileName ;
JSONObject jobj = new JSONObject();
jobj.put("path", path); writer.write(jobj.toJSONString());
writer.close();
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
} }

3.文件下载

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<base href="<%=basePath%>">
<title>下载文件</title>
</head>
<body>
<h2>文本文档</h2><a href="download.do?file=端口号别站用.txt">端口号别站用</a>
<h2>学习视频</h2><a href="download.do?file=用户角色权限.wmv">用户角色权限</a> </body>
</html>

DownLoadServlet

注意

当我们下载一个中文名的文件的时候可能会出现乱码 这时需要设置响应头的信息

Content-Disposition 响应头的格式为 inline|attachment;filename=文件名

inline表示如果该资源浏览器能够直接展示,则直接展示,否则下载,attachment表示直接以附件形式下载

如果文件有中文名 这时可以使用URLEncoder.encode方法,将文件名编码成unicode码

 package com.newroad.upload;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/download.do")
@SuppressWarnings("serial")
public class DownLoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
// 获得到参数中的下载文件的名字
String filename = req.getParameter("file");
System.out.println(filename);
File file = new File("D:/" + filename);
if (file.exists()) {
/*
* 设置响应头信息,Content-Disposition 响应头的格式为 inline|attachment;filename=文件名
* inline表示如果该资源浏览器能够直接展示,则直接展示,否则下载,attachment表示直接以附件形式下载
* 如果文件名中有中文,那么下载时,会出现中文乱码,这时可以使用URLEncoder.encode方法,将文件名编码成unicode码
*/
String contentDisposition = "attachment;filename=" + URLEncoder.encode(file.getName(), "utf-8");
resp.setHeader("Content-Disposition", contentDisposition);
// 创建文件字节读取流对象时,必须明确与之关联的数据源。
FileInputStream in = new FileInputStream(file);
// 获取输出流
OutputStream oStream = resp.getOutputStream();
// 创建缓冲区
byte[] b = new byte[1024 * 3];
// number用来判断输入流读完的标记
int number;
// 循环读取输入流中的数据到缓冲区中
while ((number = in.read(b)) != -1) {
oStream.write(b, 0, number);
}
oStream.close();
in.close();
} else {
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.write("该文件丢失了");
writer.close();
} } @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp);
}
}

javaWeb文件上传与下载的更多相关文章

  1. JavaWeb——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  2. 【Java】JavaWeb文件上传和下载

    文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...

  3. JavaWeb文件上传和下载

    文件上传和下载在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件 ...

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

    源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...

  5. JavaWeb学习总结,文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

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

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  7. JavaWeb学习 (二十八)————文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  8. JavaWeb学习总结——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  9. javaWeb中,文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

随机推荐

  1. [CareerCup] 2. Bomberman 炸弹人

    We have a 2D grid. Each cell is either a wall, an enemy or empty. For example (0-empty, X-enemy, Y-w ...

  2. Python3之返回函数

    参考:https://www.cnblogs.com/mzc1997/p/7641995.html Python中函数不仅可以作为参数还可以作为结果返回 >>> def pro1(c ...

  3. iOS从App跳转至系统设置菜单各功能项

    跳到系统设置里的WiFi界面 info里面设置: 在项目中的info.plist中添加 URL types 并设置一项URL Schemes为prefs,如下图 代码: 复制代码 代码如下: NSUR ...

  4. 云计算服务模式(SaaS/PaaS/IaaS)

    为什么是云计算,为什么是现在 商用云:商用云的设计初衷是将基础设施商品化,并以较低的成本对外提供,是用户能够获得高扩展性和自服务能力. 企业云:企业级云的目的,则是达到或超过它所要替代的本地基础设施的 ...

  5. redis windows 扩展Redis igbinary 下载地址

    http://windows.php.net/downloads/pecl/releases/redis/3.1.2/ http://windows.php.net/downloads/pecl/re ...

  6. 19年最新 Python0基础学习书籍推荐(内涵PDF地址以及书籍源码)

    去年看过一篇文章,是关于18年的最适合0基础学习的书籍,今年,最新的书籍也已经统计出来.书籍的PDF太过于难找,所以很多PDF都找不到. 仅仅只能找到英文版PDF 本文章统计了18.19并做过对比,在 ...

  7. Java线程池的使用方式,核心运行原理、以及注意事项

    为什么需要线程池 java中为了提高并发度,可以使用多线程共同执行,但是如果有大量线程短时间之内被创建和销毁,会占用大量的系统时间,影响系统效率. 为了解决上面的问题,java中引入了线程池,可以使创 ...

  8. 剑指offer30:连续子数组的最大和

    1 题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果 ...

  9. js 颜色随机切换

    生成随机颜色 方法1:RGB模式 function randomColor1() { var r=Math.floor(Math.random()*256); var g=Math.floor(Mat ...

  10. 15_IO流

    IO流 流 流的概念 流(stream)是指一连串流动字节/字符,按照先进先出的方式发送的信息的通道中. 数据源:流入通道中的数据的来源 目的地:流出通道的数据的目的地   输入流和输出流 数据源的数 ...