ie11 java 下载文件_Javaweb实现上传下载文件的多种方法
在Javaweb中,上传下载是经常用到的功能,对于文件上传,浏览器在上传的过程中是以流的过程将文件传给服务器,一般都是使用commons-fileupload这个包实现上传功能,因为commons-fileupload依赖于commons-io这个包,所以需要下载这两个包commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar。
1、搭建环境
创建Web项目,将包导入到项目lib下
2、实现文件上传
(第一种上传的方法)
新建upload.jsp页面
pageEncoding="UTF-8"%>
upload file
选择文件:
新建处理文件上传的Servlet
package com.load;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet("/uploadServlet")
public class uploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public uploadServlet() {
super();
}
/* fileupload 包中, HTTP 请求中的复杂表单元素都被看做一个 FileItem 对象;
* FileItem 对象必须由 ServletFileUpload 类中的 parseRequest() 方法解析 HTTP 请求
* (即被包装之后的 HttpServletRequest 对象)出来,即分离出具体的文本表单和上传文件
* */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过isMultipartContent()方法:分析请求里面是不是有文件上的请求,
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if(isMultipart){
//创建可设置的磁盘节点工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//获取请求的上下文信息
ServletContext servletContext = request.getServletContext();
//缓存目录,每个服务器特定的目录
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
//设置服务器的缓存目录
factory.setRepository(repository);
//ServletFileUpload 对象的创建需要依赖于 FileItemFactory
//工厂将获得的上传文件 FileItem 对象保存至服务器硬盘,即 DiskFileItem 对象。
ServletFileUpload upload = new ServletFileUpload(factory);
try {
//解析即被包装之后的 HttpServletRequest对象,既是分离文本表单和上传文件(http请求会被包装为HttpServletRequest)
List items = upload.parseRequest(request);
for(FileItem item:items){
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
//实例化一个文件
//request.getRealPath(获取真实路径)
File file = new File(request.getRealPath("/")+"/loads"+fileName.substring(fileName.lastIndexOf("\\")+1,fileName.length()));
item.write(file);
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
(第二种上传的方法)
新建Jsp页面(同上,只是路径改变下)
pageEncoding="UTF-8"%>
upload file
选择文件:
建立Servlet处理上传
package com.load;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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("/uploadservlet1")
@MultipartConfig(location="")
public class uploadservlet1 extends HttpServlet {
private static final long serialVersionUID = 1L;
public uploadservlet1() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("utf-8");
//取得上传文件,读取文件
Part part = request.getPart("file1");
//定义一个变量去接收文件名
String filename = null;
//Content-Disposition: 就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名
//Content-Disposition:告诉浏览器以下载的方式打开文件
for (String content : part.getHeader("content-disposition").split(";")) {
System.out.println(content);
//取得文件名
if (content.trim().startsWith("filename")) {
//截取文件名
filename = content.substring(
content.indexOf('=') + 1).trim().replace("\"", "");
}
}
//输出流
OutputStream out = null;
//输入流
InputStream filecontent = null;
//File.separator 取得系统的分割线等数据
out = new FileOutputStream(new File("e:/loads" + File.separator + filename));
int read;
//获得一个输入流
filecontent = part.getInputStream();
final byte[] bytes = new byte[1024];
while ((read = filecontent.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
System.out.println("New file " + filename + " created at " + "/loads");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
(第三种上传的方法)
这里使用的是jspSmartUpload包上传下载,笔者认为这种上传下载较为简单,但是好像不是很多人用,不懂。
创建HTML页面
上传文件
上传文件选择
1. |
2. |
3. |
创建Servlet处理上传文件
package com.load;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspFactory;
import javax.servlet.jsp.PageContext;
import com.jspsmart.upload.File;
import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;
@WebServlet("/DouploadServlet")
public class DouploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public DouploadServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//新建一个智能上传对象
SmartUpload su = new SmartUpload();
/*
* PageContext pageContext;
HttpSession session;
ServletContext application;
ServletConfig config;
JspWriter out;
Object page = this;
HttpServletRequest request,
HttpServletResponse response
其中page对象,request和response已经完成了实例化,而其它5个没有实例化的对象通过下面的方式实例化
pageContext = jspxFactory.getPageContext(this, request, response,null, true, 8192, true);
*/
//通过Jsp工厂类获取上下文环境
PageContext pagecontext = JspFactory.getDefaultFactory().getPageContext(this, request, response, null, true, 8192, true);
//上传初始化
su.initialize(pagecontext);
//上传文件
try {
su.upload();
//将上传文件保存到指定目录
int count = su.save("/share");
out.println(count+"个文件上传成功!
"+su.toString());
} catch (SmartUploadException e) {
e.printStackTrace();
}
//逐个提取上传文件信息
for(int i=0;i
File file = su.getFiles().getFile(i);
//如果文件不存在
if(file.isMissing()) continue;
//显示当前文件信息
out.println("
out.println("
表单项名(FieldName)"+file.getFieldName()+"");
out.println("
文件长度"+file.getSize()+"");
out.println("
文件名"+file.getFileName()+"");
out.println("
文件扩展名"+file.getFileExt()+"");
out.println("
文件全名"+file.getFilePathName()+"");
out.println("
");
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
注意:代码 int count = su.save("/share");表示你需要先建个文件夹,所以你可以先在Webcontent建立一个,然后将项目取消部署,再重新部署进去之后就会在运行那边建立起一个文件夹了!
或者你可以直接找到运行的路径,然后建立share文件夹。
3、实现文件下载
(第一种文件下载)
注意:该代码是直接访问Servlet类的
package com.load;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//直接使用Http://localhost:8080/Test1/download进行下载,但是这个有缺陷,如果下载文件名中有中文,就会变成乱码现象!
@WebServlet("/download")
public class download extends HttpServlet {
private static final long serialVersionUID = 1L;
public download() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/plain;charset=utf-8");
response.setCharacterEncoding("utf-8");
response.setHeader("Location","中文.txt");
response.setHeader("Content-Disposition", "attachment; filename=" + "账号.txt");
OutputStream outputStream = response.getOutputStream();
InputStream inputStream = new FileInputStream("E:/loads"+"/账号.txt");
byte[] buffer = new byte[1024];
int i = -1;
while ((i = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, i);
}
outputStream.flush();
outputStream.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
(第二种下载方法)
新建jsp页面选择下载
pageEncoding="UTF-8"%>
下载
点击下载
创建Servlet类进行下载(注意:该下载如果文件名是中文的话,一样会出现乱码现象)
package com.load;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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;
import javax.servlet.jsp.JspFactory;
import javax.servlet.jsp.PageContext;
import org.hsqldb.lib.StringUtil;
import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;
@WebServlet("/DoDownloadServlet")
public class DoDownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public DoDownloadServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到下载文件的名称
//String filename = request.getParameter("filename");
//String filename = new String(FileName.getBytes("iso8859-1"),"UTF-8");
//新建SmartUpload对象
SmartUpload su = new SmartUpload();
PageContext pagecontext = JspFactory.getDefaultFactory().getPageContext(this, request, response, null, true, 8192, true);
//上传初始化
su.initialize(pagecontext);
//设置禁止打开该文件
su.setContentDisposition(null);
//下载文件
try {
su.downloadFile("/listener/"+filename);
} catch (SmartUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
(第三种下载的方法)
同上的jsp页面代码,这里就不再重复了。
新建Serlvet类,实现下载功能(注意:这里文件名就算是中文名,也不会出现乱码问题了!)
package com.load;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
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;
import javax.servlet.jsp.JspFactory;
import javax.servlet.jsp.PageContext;
import org.hsqldb.lib.StringUtil;
import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;
@WebServlet("/DoDownloadServlet")
public class DoDownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public DoDownloadServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得文件名称
String path1 = request.getParameter("filename");
//获得路径名称
String path = request.getSession().getServletContext().getRealPath("/listener/"+path1);
// path是根据日志路径和文件名拼接出来的
File file = new File(path);
String filename = file.getName();
try {
//判断是否是IE11
Boolean flag= request.getHeader("User-Agent").indexOf("like Gecko")>0;
//IE11 User-Agent字符串:Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
//IE6~IE10版本的User-Agent字符串:Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.0; Trident/6.0)
if (request.getHeader("User-Agent").toLowerCase().indexOf("msie") >0||flag){
filename = URLEncoder.encode(filename, "UTF-8");//IE浏览器
}else {
//先去掉文件名称中的空格,然后转换编码格式为utf-8,保证不出现乱码,
//这个文件名称用于浏览器的下载框中自动显示的文件名
filename = new String(filename.replaceAll(" ", "").getBytes("UTF-8"), "ISO8859-1");
//firefox浏览器
//firefox浏览器User-Agent字符串:
//Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0
} InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer;
buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
response.reset();
response.addHeader("Content-Disposition", "attachment;filename=" +filename);
response.addHeader("Content-Length", "" + file.length());
OutputStream os = response.getOutputStream();
response.setContentType("application/octet-stream");
os.write(buffer);// 输出文件
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(filename);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
ie11 java 下载文件_Javaweb实现上传下载文件的多种方法相关推荐
- 如何在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作...
Phpstorm除了能直接打开localhost文件之外,还可以连接FTP,除了完成正常的数据传递任务之外,还可以进行本地文件与服务端文件 的异同比较,同一文件自动匹配目录上传,下载,这些功能是平常I ...
- ThinkPhp上传文件提示“没有上传的文件”解决方案
使用ThinkPhp框架上传小图片文件成功,上传大文件失败. 后来查找了原因,是因为php限制了上传文件的大小,修改php.ini如下配置: upload_max_filesize = 300M po ...
- Java实现七牛云文件或图片上传下载
写在前面 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:人工智能学习网站 文章目录 写在前面 一.准备工作 1.1.为什么选择七牛云? 1.2.七牛云注册 二.ja ...
- 基于Java+hadoop网络云盘上传下载系统设计与实现
目 录 网络云盘上传下载系统摘要----------------------------------5 The Network Cloud Disk`s Upload and DownloadAbst ...
- linux curl 命令 http请求、下载文件、ftp上传下载
1. curl 命令简介 cURL(CommandLine Uniform Resource Locator),是一个利用 URL 语法,在命令行终端下使用的网络请求工具,支持 HTTP.HTTPS. ...
- maven 项目 springMVC实现文件图片的上传下载功能详解(源码已提供,小白必看)
文件上传是项目开发中最常见的功能之一 ,springMVC 可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此默认情况下其不能处理文件上传工作. ...
- 使用Git工具从GitHub上文件代码进行上传下载(图文详细)
1.注册一个GitHub账号 GitHub: Where the world builds software · GitHub 此链接为GitHub官网 由于GitHub是国外的网站,访问会很慢,又 ...
- C++ vs2017 - libcurl - http请求 代码大全(请求数据,上传下载文件,多线程上传下载文件)
在网上搜寻各种libcurl的用法,将代码集合于此! 目录 一.配置curl项目 二.Curl 请求参数 1. CURLOPT_POST 2. CURLOPT_URL 3. CURLOPT_HTTPH ...
- php改名下载,PHP如何给上传的文件改名
PHP如何给上传的文件改名 发布时间:2020-08-03 16:07:39 来源:亿速云 阅读:72 作者:Leah PHP如何给上传的文件改名?相信很多没有经验的人对此束手无策,为此本文总结了问题 ...
最新文章
- 层次聚类python_用python绘制层次聚类图
- 2.1顺序表(链表)
- [原创]Devexpress XtraReports 系列 10 创建标签报表
- 【OpenCV3】旋转矩形(cv::RotateRect)的绘制
- 《TOGAF 9.1IT企业架构》什么是企业IT架构
- pyecharts地图使用
- 目标检测用在《人脸识别》
- linux的shell脚本if语句,Shell脚本编程之判断语句
- linux pgpgin pgpgout pswpin pswpout 说明
- jsp中头的导入两种方式区别
- python引入redis_实操演练解读非关系型数据库—Redis
- grid studio python_Grid studio表格应用程序:Python的集大成者
- 大智慧有Linux炒股软件,UOS(Deepin Linux)安装炒股软件(通达信大智慧等)的方法...
- Excel工作日日历
- 小米路由器4C从0到自编译以及刷固件
- 如何拥有一个游戏策划的思维
- ckplayer html播放本地,vue中使用ckplayer播放器
- -verbose:gc 和 -XX:+PrintGC 的区别
- ZooKeeper客户端源码(三)——Watcher注册与通知
- 云计算、大数据、人工智能傻傻分不清楚?本文详解这三者的关系