JavaWeb学习记录(二十三)——文件上传与下载
一、导入jar包
二、java应用:
(1)文件上传
国际化:
hytc.properties
uploaderror=The field upfile exceeds its maximum permitted size of {0} bytes
msg=You can only upload {0} form,can't upload {1} form file
hytc_zh.properties
uploaderror=\u5141\u8BB8\u4E0A\u4F20\u6587\u4EF6\u7684\u6700\u5927\u503C\u4E3A {0} \u5B57\u8282
msg=\u53EA\u5141\u8BB8\u4E0A\u4F20\u7684\u6587\u4EF6\u683C\u5F0F\u662F {0} \uFF0C\u4E0D\u5141\u8BB8\u4E0A\u4F20 {1} \u683C\u5F0F\u7684\u6587\u4EF6
hytc_en.properties
uploaderror=The field upfile exceeds its maximum permitted size of {0} bytes
msg=You can only upload {0} form,can't upload {1} form file
index.jsp页面
<div>
<c:if test="${maxsize!=null }">
<fmt:bundle basename="hytc">
<fmt:message key="uploaderror">
<fmt:param value="${maxsize }"></fmt:param>
</fmt:message>
</fmt:bundle>
</c:if>
<c:if test="${contenttype!=null }">
<fmt:bundle basename="hytc">
<fmt:message key="msg">
<fmt:param value="${filetypes }"/>
<fmt:param value="${contenttype }"/>
</fmt:message>
</fmt:bundle>
</c:if>
</div>
<div>
<h3>文件上传案例</h3>
<form method="post" enctype="multipart/form-data" action="${pageContext.request.contextPath }/upload.do">
<table>
<tr>
<td>File to load:</td>
<td><input type="file" name="upfile"></td>
</tr>
<tr>
<td>File to load:</td>
<td><input type="file" name="upfiles"></td>
</tr>
<tr>
<td>Notes about the file:</td>
<td><input type="text" name="note"/></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="上传"/>
</td>
</tr>
</table>
</form>
</div>
<div>
<a href="${pageContext.request.contextPath }/down.do?oper=pre">下载资源</a>
</div>
</body>
上传的Java代码及注意事项:
注意1:编码方式
注意2:删除临时文件
注意3:不同浏览器的设置
注意4:上传的目录设置
注意5:查看进度
注意6:设置上传文件最大字节数
注意7:限制文件上传格式
// 允许上传文件的最大值(单个文件)
private long maxsize = 2 * 1024 * 1024;
// 允许上传的文件类型
private List fileTypes = Arrays.asList("image/png", "image/jpeg", "image/gif", "image/bmp");
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置编码方式
request.setCharacterEncoding("UTF-8");
// multipart/form-data
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
// 判断是否是上传文件
if (isMultipart) {
// 创建FileItem <input type="text" name="upfile"> 工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
// 获取ServletContext对象
ServletContext servletContext = this.getServletConfig().getServletContext();
// 获取上下文 文件的临时目录
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
// 设置上传文件临时目录
factory.setRepository(repository);
// 创建文件上传的处理对象
ServletFileUpload upload = new ServletFileUpload(factory);
//设置编码方式
upload.setHeaderEncoding("UTF-8");
//创建一个进度监听对象
ProgressListener progressListener = new ProgressListener(){
/**
* 进度发生变化的时候处理的方法
* pBytesRead 上传的进度
* pContentLength 总大小
* pItems 那个条目 1
*/
public void update(long pBytesRead, long pContentLength, int pItems) {
System.out.println("We are currently reading item " + pItems);
if (pContentLength == -1) {
System.out.println("So far, " + pBytesRead + " bytes have been read.");
} else {
System.out.println("So far, " + pBytesRead + " of " + pContentLength
+ " bytes have been read.");
}
}
};
//设置监听
upload.setProgressListener(progressListener);
try {
// 根据upload对象.parseRequest(request) 每个请求文件条目对象
List<FileItem> items = upload.parseRequest(request);
System.out.println("条目的大小数量:::::"+items.size());
upload.setFileSizeMax(maxsize);// 字节
// 根据upload对象.parseRequest(request) 每个请求文件条目对象
List<FileItem> items = upload.parseRequest(request);
// 先遍历一次
for (int index = 0; index < items.size(); index++) {
// 获取具体的一个条目
FileItem fileItem = items.get(index);
// 是否是上传的<input type='file'>控件
if (!fileItem.isFormField()) {
String contentType = fileItem.getContentType();
System.out.println(contentType);
/**
* application/vnd.ms-excel,image/png,image/jpeg,image/
* gif,image/bmp
*/
// 判断
if (!fileTypes.contains(contentType)) {
request.setAttribute("msg",
"文件上传只允许上传" + fileTypes.toString()
+ ",不允许上传" + contentType);
request.getRequestDispatcher("./index.jsp")
.forward(request, response);
return;
}
}
}
// 获取集合的迭代器对象
Iterator<FileItem> iter = items.iterator();
// 判断是含有下一个条目
while (iter.hasNext()) {
// 获取条目对象
FileItem item = iter.next();
// 判断这个item条目是否是普通的文本条目<input type="text" name="note">
if (item.isFormField()) {
String name = item.getFieldName(); // 获取name的名称 note
String value = item.getString(); // 获取输入框中输入的value值
//转码 解决乱码问题
value = new String(value.getBytes("ISO8859-1"),"UTF-8");
System.out.println(name + "-----" + value);
} else {
// <input type="file" name="upfile">
String fileName = item.getName(); // 获取文件的名称
//1427791277139_C:\Users\hj\Desktop\1104报到情况统计.xls
int index = fileName.lastIndexOf("\\");
File file =null;
//保存路径地址
String path = request.getServletContext().getRealPath("/WEB-INF/upload");
//判断是否含有\
if(index==-1){
// 写入到磁盘上 firefox浏览器的文件创建
//file= new File(parentFile,System.currentTimeMillis()+"_"+fileName);
file = createSaveFile(path, fileName);
}else{
//IE浏览器的处理方式
//file= new File(parentFile,System.currentTimeMillis()+"_"+fileName.substring(index+1));
file = createSaveFile(path,fileName.substring(index + 1));
}
// 输出流
OutputStream os = new FileOutputStream(file);
// 读取文件
InputStream is = item.getInputStream();
// 定义缓冲区
byte buffer[] = new byte[1024];
// 定义读取的长度
int len = 0;
// 循环读取
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);// 写入
}
// 释放资源
os.flush();
os.close();
is.close();
//删除临时文件
item.delete();
}
}
//上传成功
//下载此网站的所有资源
request.getRequestDispatcher("./down.do?oper=pre").forward(request, response);
} catch (FileUploadBase.FileSizeLimitExceededException fsle) {
request.setAttribute("maxsize", maxsize);
request.getRequestDispatcher("./index.jsp").forward(request,
response);
}catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.out.println("没有上传文件");
}
}
/**
* 文件名称及文件父目录 拼接而成
*
* @return
*/
public File createSaveFile(String path, String fileName) {
File file = null;
// 代表对象的内存存储地址 0x888aBF; 4321 0xf;
int hashCode = fileName.hashCode();
int dir1 = hashCode & 0xf; // 目录1
int dir2 = (hashCode >> 4) & 0xf;// 目录2
// 根据算法生成目录结构
path = path + "\\" + dir1 + "\\" + dir2;
// 父目录对象
File parentFile = new File(path);
// 判断父目录是否存在
if (!parentFile.exists()) {
parentFile.mkdirs();
}
// 创建文件对象
file = new File(parentFile, System.currentTimeMillis() + "_" + fileName);
return file;
}
(2)文件下载:
下载的jsp页面:
<!-- 1.下载方式 -->
<a href="${pageContext.request.contextPath}/images/1.png">1.png</a>
<h2>所有下载的资源</h2>
<c:forEach var="file" items="${map}">
<div>
<%-- <a href="${file.key}">${file.value}</a> --%>
<a href="${pageContext.request.contextPath}/down.do?oper=down&path=${file.key}">${file.value }</a>
</div>
</c:forEach>
下载的Java代码及注意事项:
public class DownLoadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");//tomcat8
String oper = request.getParameter("oper");
if("pre".equals(oper)){
//找到所有的资源文件 WEB-INF/upload/
String path=request.getServletContext().getRealPath("/WEB-INF/upload");
System.out.println("path:="+path);
//创建父目录对象
File file = new File(path);
//遍历父目录
iteratorFiles(file);
//遍历这里所有文件 把这些文件存储到什么位置
request.setAttribute("map", map);
//转发到下载页面操作
request.getRequestDispatcher("./down.jsp").forward(request, response);
}else if("down".equals(oper)){
//获取下载文件的地址 /WEB-INF/upload+"----"
String path = request.getParameter("path");
//获取指定下载的文件地址
String filePath=request.getServletContext().getRealPath(path);
System.out.println("filepath=:"+filePath);
//创建文件对象
File file = new File(filePath);
//创建文件的输入流对象
InputStream is = new FileInputStream(file);
//设置响应的类型
response.setContentType("application/x-msdownload");
//设置相应的头
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(file.getName().substring(file.getName().lastIndexOf("_")+1), "UTF-8"));//防止乱码
//获取输出流对象
OutputStream os = response.getOutputStream();
//缓冲区
byte buffer[]= new byte[1024];
//读取的长度
int len=0;
//循环读取
while((len=is.read(buffer))!=-1){
os.write(buffer, 0, len);//写入
}
//释放资源
os.close();
is.close();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
//创建存储文件的map集合对象
private Map<String,String> map = new TreeMap<String, String>();
/**
* 遍历文件
* @param file
*/
private void iteratorFiles(File file) {
//得到此文件下面的所有文件
File files[]=file.listFiles();
for(File f:files){
if(f.isDirectory()){
iteratorFiles(f);//递归
}else {
// 获取文件名称
String fileName = f.getName();
fileName = fileName.substring(fileName.indexOf("_") + 1);
// 获取文件的路径
String path = f.getPath();
path = path.substring(path.indexOf("\\WEB-INF"));
// 替换字符
path = path.replace('\\', '/');
// 存入到map集合中
map.put(path, fileName);
}
}
}
}
效果:
上传其他格式的文件后
下载
JavaWeb学习记录(二十三)——文件上传与下载的更多相关文章
- (转载)JavaWeb学习总结(五十)——文件上传和下载
源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...
- JavaWeb学习总结(五十)——文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- Javaweb学习笔记——(二十二)——————文件上传、下载、Javamail
文件上传概述 1.文件上传的作用 例如网络硬盘,就是用来上传下载文件的. 在网络浏览器中,时常需要上传照片 2.文件上传对页面的要求 上 ...
- Struts2学习(六)———— 文件上传和下载
一.单文件上传 在没学struts2之前,我们要写文件上传,非常麻烦,需要手动一步步去获取表单中的各种属性,然后在进行相应的处理,而在struts2中就不需要了,因为有一个fileUpload拦截器帮 ...
- 学习Struts--Chap07:Struts2文件上传和下载
1.struts2文件上传 1.1.struts2文件上传的基本概述 在开发web应用的时候,我们一般会为用户提供文件上传的功能,比如用户上传一张图像作为头像等.为了能上传文件,我们必须将表单的met ...
- 基于jsp的文件上传和下载
参考: 一.JavaWeb学习总结(五十)--文件上传和下载 此文极好,不过有几点要注意: 1.直接按照作者的代码极有可能listfile.jsp文件中 <%@taglib prefix=&qu ...
- JavaWeb学习 (二十八)————文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- java web学习总结(二十四) -------------------Servlet文件上传和下载的实现
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- JavaWeb学习总结,文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
- JavaWeb学习总结——文件上传和下载
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...
随机推荐
- IT公司100题-1-二叉树转换为双链表
问题描述: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 10 / \ 6 14/ \ / \4 8 1 ...
- Android 之 数据存储
在Android操作系统中,提供了5种数据存储方式:SharedPreferences存储,文件存储,SQLite数据库存储,ContentProvider存储和网络存储. 一.SharedPrefe ...
- 由于lightdm.conf 错误无法进入ubuntu 的办法
由于自己向默认登录GNOME桌面,所以修改了lightdm,由于参数错误,结果无法启动桌面? 这是需要进入shell界面: 1.选择cancel ,如果虚拟机下无法点击cancel按钮,可以使用快捷键 ...
- ios上传应用后,审核流程完成前(reveiw)修改了程序内容,如何上传替换
其实挺简单,只需要更改下version和build版本 看图说话就可以.我的程序之前版的版本设置 修改bug之后的设置: 然后重新打包就好了,提示打包成功后,在itunesconnect查看发现 选中 ...
- 打造高质量Android应用:Android开发必知的50个诀窍
打造高质量Android应用:Android开发必知的50个诀窍
- poj3667 线段树 区间合并
//Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...
- ZOJ 2672 Fibonacci Subsequence(动态规划+hash)
题意:在给定的数组里,寻找一个最长的序列,满足ai-2+ai-1=ai.并输出这个序列. 很容易想到一个DP方程 dp[i][j]=max(dp[k][i])+1. (a[k]+a[i]==a[j], ...
- C++中的::operator new, ::operator delete
一般在使用new 和 delete的时候,做了两件事情,一是空间的配置( new 是分配,delete是回收),而是调用对象的析构函数 但是也有办法将这两个过程分开 那就是显式的调用::operat ...
- webservice实验一
实验目的:安装jdk1.6_21以后的版本,利用JAX-WS API自己发布webservice并调用,以及用wsimport生成webservice客户端代码调用一个免费的web服务(如webxml ...
- 显示ios设备信息的程序
以下是运行在本人iphone4上的截图,支持中文简体,中文繁体,英文,支持iphone和ipad,当然由于没有ipad,ipad的测试用的模拟器.支持iphone4的Retina屏幕.本来有6个标签, ...