JSP基础:(7)jsp分页与文件上传下载
目录
1 jsp分页
1.1 定义
1.2 Servlet控制器方法
2 文件上传下载
2.1 定义
2.2 SmartUpload
2.2.1 介绍
2.2.2 SmartUpload组件-Request类
2.3 上传
2.3.1 前台上传页面
2.3.2 Apache fileUpload
2.3.3 ServletFileUpload
2.3.4 Commons FileUpLoad
2.3.5 java自带api FTPClient
2.4 下载
2.4.1 页面下载
2.4.2 java代码示例
1 jsp分页
1.1 定义
如果查询出的数据量过大,将这些数据在一个页面全部显示的话,就会花更多的时间将这些大量数据从服务器传递到客户端,从而导致客户端页面打开速度变慢,当多个用户同时访问服务器时,每个用户都查询出大量的数据,而这些数据都必须在服务器端的内存中存放,这势必造成服务器的内存资源紧张甚至崩溃,降低服务器的运行效率
除了需要所必须的数据之外,还显示了记录的总条数、当前页码和总页数;并且图示表明每页显示4条数据,这个数值可以人为设定
public class PageBean {private int pagesize;//每页显示的条数private int pagetotal;//总页数private int p;//当前第p页private int count;//记录总条数private List data;//存放本页数据的集合
}
List类型的对象data如果不实例化,在使用时会报出NullException异常。所以给该类设计一个无参数的构造函数,其主要目的是对List对象进行实例化,同时可以设定默认每页显示的记录条数
public PageBean(){pagesize=4;//默认设置每页显示4条记录data=new ArrayList();}
每页显示的条数已经在构造函数中确定为4,为灵活起见,假如某些页面需要每页显示10条记录,可以在PageBean中设计一个public setPagesize(int)方法
页面显示的总页数应该是由记录总条数除以每页显示的条数后,向上取整得到。换言之,变量pagetotal是依赖于变量count和pagesize的,所以设计变量count的set方法为
public void setCount(int count) {this.count = count;pagetotal=(int)(Math.ceil(count*1.0/pagesize));}
当前显示的页码值p的取值范围必然是[1,pagetotal]。考虑到用户在页面显示第一页时,也可能再次点击“上一页”链接,或者在页面处于最后一页时点击“下一页”,
从而导致用户要显示的页码在此取值范围之外。所以此时必须对用户传递过来的待显示的页码p值做一判断
public void setP(int up) {if(up<1)p=1;else if(up>pagetotal)p=pagetotal;else p=up;}
1.2 Servlet控制器方法
调用该方法的Servlet控制器的方法中,需要对待显示页码进行判断,如果用户没有输入页码时,比如第一次访问分页页面,就默认显示第一页
单表查询分页
public void allContact(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {DBC dbc=new DBC();int up=1;//默认显示第一页String ps=request.getParameter("p");//获取传递过来的页码if(ps!=null)up=Integer.parseInt(ps);PageBean pb=dbc.allContact(up);request.setAttribute("pb",pb);request.getRequestDispatcher("allcontact.jsp").forward(……);}
登陆者查询联系人并分页
public void myContact(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {DBC dbc=new DBC();int up=1;//默认显示第一页String ps=request.getParameter("p");//传递过来的页码if(ps!=null)up=Integer.parseInt(ps);Users u=(Users)request.getSession().getAttribute("u");PageBean pb=dbc.myContact(u.getUid(),up);request.setAttribute("pb",pb);request.getRequestDispatcher("mycontact.jsp").forward(…);}
2 文件上传下载
2.1 定义
服务器组件:编写控制器Servlet时,必须要继承HttpServlet类;而在创建编码过滤器时,需要实现Filter接口。 这些HttpServlet类和Filter接口都是Tomcat服务器的lib目录下的jar包中所存在的,这些由服务器提供的类或接口,称为服务器组件
自定义组件:在项目中,我们编写了DAO持久化层连接数据库,其中包括连接工厂类、DAO接口、DAO接口实现类和封装数据的JavaBean, 这些自定义的类或接口,称为自定义组件
第三方组件:有时候一个项目中的某些功能既不能使用服务器组件来实现,也无法或不容易使用自定义组件来实现, 此时就需要借助第三方组织或个人编写的、用于实现特定功能的类或接口,这些类或接口通常封装成为一个jar包, 直接放置于自己项目的lib目录下就可以使用,这些jar包就称为第三方组件。
2.2 SmartUpload
2.2.1 介绍
SmartUpload.jar是从网络上下载的一个第三方组件,使用前只需将其复制到web项目的lib目录下即可
SmartUpload组件-File类
这个类封装了一个上传文件的所有信息。通过它,可以得到上传文件的文件名、文件大小、扩展名、文件数据等信息。主要方法有:
public void saveAs(String) | 将文件换名另存。参数是以/开头的文件路径,文件将被存放于当前项目的根目录下 |
public String getFieldName() | 获取HTML表单中此上传文件的组件的名字 |
public String getFileName() | 获取上传的“文件名.扩展名” |
public String getFilePathName() | 获取上传的文件全名称(带路径) |
public String getFileExt() | 获取文件的扩展名 |
public int getSize() | 获取文件长度,单位字节 |
这个类表示所有上传文件的集合,通过它可以得到上传文件的数目、大小等信息。其中的主要方法有:
public int getCount() | 获取此次文件上传的总数目 |
public File getFile(int) | 获取指定索引处的文件 |
public long getSize() | 获取此次文件上传的总字节数 |
2.2.2 SmartUpload组件-Request类
这个类的功能等同于JSP内置的对象request。之所以提供这个类,是因为对于文件上传表单,通过JSP内置的request对象无法获得表单项的值,必须通过jspSmartUpload组件提供的Request对象来获取。
其主要方法有 :
public final void initialize(PageContext) | 初始化方法 |
public void upload() | 文件上传。并检测文件大小和文件类型是否符合要求 |
public void setAllowedFilesList(String) | 设置允许上传的文件类型,参数可以使用“,”号隔开 |
public void setMaxFileSize(long) | 设置每个文件允许的最大字节数 |
public void setTotalMaxFileSize(long) | 设置允许上传的文件总字节数 |
public Request getRequest() | 取得Request对象,用于取得表单组件的值 |
public void setDeniedFilesList(String) | 限制那些类型的文件不允许上传。参数是文件的扩展名列表,可以使用“,”号隔开 |
public void setContentDisposition(null) | 在下载前调用。若不设定,下载的文件如果是doc文档,浏览器将调用word打开,如果是pdf文档,浏览器将调用Acrobat打开 |
文件上传-页面设计
以下案例使用Servlet作为控制器,接收客户端的上传文件并保存在upload目录下。upload目录在执行前必须先创建。
上传文件的表单必须设置以下两个属性:
method=“post”:文件上传必须使用post,因为使用get能够传送的数据大小有限制(2K字节或255个字符)
enctype=“multipart/form-data”:表明当前表单提交的数据有多个部分组成
文件上传-Servlet控制器
如果使用JSP作为文件上传处理器,SmartUpload类的实例化和初始化方式为:
SmartUpload su = new SmartUpload();su.initialize(pageContext);
文件下载-文件列表页面
<table width=300 cellspacing=0><%//读取upload下所有文件列表准备下载File f=new File(request.getRealPath("/upload"));File[] fs=f.listFiles();for(int i=0;i<fs.length;i++){%><tr><td style="text-align:left;"><a href="download?fname=<%=fs[i].getName()%>"><%=fs[i].getName()%></a></td></tr><%} %></table>
文件下载-Servlet控制器
点击某个文件链接后跳转到Servlet访问地址download中,同时将文件名也发送过去。
运行前注意将server.xml中的<Connector>元素加入属性URIEncoding="gbk",和页面编码一致。
使用SmartUpload注意事项
注意:如果使用JSP页面替代DownloadFile.java文件的话,在Java脚本范围外(即<% ... %>之外),
不要包含HTML代码、空格、回车或换行等字符,有的话将不能正确下载。因为它影响了返回给浏览器的数据流,导致解析出错
2.3 上传
2.3.1 前台上传页面
前台页面使用 JQuery Uploadify 无刷新上传
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%String path = request.getContextPath();String basePath = request.getScheme() + "://"+ request.getServerName() + ":" + request.getServerPort()+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>Upload</title><!--装载文件-->
<link href="css/default.css" rel="stylesheet" type="text/css" />
<link href="css/uploadify.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="scripts/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="scripts/swfobject.js"></script>
<script type="text/javascript" src="scripts/jquery.uploadify.v2.1.4.min.js"></script><!--ready事件-->
<script type="text/javascript">$(document).ready(function() {$("#uploadify").uploadify({'uploader' : 'scripts/uploadify.swf','script' : 'servlet/Upload',//后台处理的请求'cancelImg' : 'images/cancel.png','folder' : 'uploads',//您想将文件保存到的路径'queueID' : 'fileQueue',//与下面的id对应'queueSizeLimit' : 5,'fileDesc' : 'rar文件或zip文件','fileExt' : '*.rar;*.zip', //控制可上传文件的扩展名,启用本项时需同时声明fileDesc'auto' : false,'multi' : true,'simUploadLimit' : 2,'buttonText' : 'BROWSE'});});
</script>
</head><body><div id="fileQueue"></div><input type="file" name="uploadify" id="uploadify" /><p><a href="javascript:jQuery('#uploadify').uploadifyUpload()">开始上传</a> <a href="javascript:jQuery('#uploadify').uploadifyClearQueue()">取消所有上传</a></p>
</body>
</html>
或者只使用html
<html>
<body> <form action="upload.jsp" id="form1" name="form1" encType="multipart/form-data" method="post" target="hidden_frame" > <input type="file" id="file" name="file" style="width:450"> <INPUT type="submit" value="上传文件"><span id="msg"></span> <br> <font color="red">支持JPG,JPEG,GIF,BMP,SWF,RMVB,RM,AVI文件的上传</font> <iframe name='hidden_frame' id="hidden_frame" style='display:none'></iframe>
</form> </body>
</html> <script type="text/javascript">
function callback(msg)
{ document.getElementById("file").outerHTML = document.getElementById("file").outerHTML; document.getElementById("msg").innerHTML = "<font color=red>"+msg+"</font>";
}
</script>
ajaxFileUpload是一个异步上传文件的jQuery插件。
语法:$.ajaxFileUpload([options])
options参数说明:
- url:上传处理程序地址。
- fileElementId:需要上传的文件域的ID,即的ID。
- secureuri:是否启用安全提交,默认为false。
- dataType:服务器返回的数据类型。可以为xml,script,json,html。如果不填写,jQuery会自动判断。
- success:提交成功后自动执行的处理函数,参数data就是服务器返回的数据。
- error:提交失败自动执行的处理函数。
- data:自定义参数。这个东西比较有用,当有数据是与上传的图片相关的时候,这个东西就要用到了。
- type:当要提交自定义参数时,这个参数要设置成post
2.3.2 Apache fileUpload
使用apache fileUpload上传示例:
public class UploadServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { /** 初始化上传文件的临时存放目录 */ File tmpDir = null; /** 初始化上传文件后的保存目录 */ File saveDir = null; public UploadServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); try { // 检查是否是文件上传类型的请求 enctype="multipart/form-data" if (ServletFileUpload.isMultipartContent(request)) { // 创建一个基于磁盘的文件项目 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setRepository(tmpDir);// 指定上传文件的临时目录 factory.setSizeThreshold(1024000);// 指定在内存中缓存数据大小,单位为byte // 创建一个新的文件上传处理程序 ServletFileUpload upload = new ServletFileUpload(factory); upload.setFileSizeMax(5000000);// 指定单个上传文件的最大尺寸 upload.setSizeMax(10000000);// 指定一次请求上传多个文件的总尺寸 // 解析request请求,并执行相应操作 FileItemIterator fileItems = upload.getItemIterator(request); while (fileItems.hasNext()) { // 从集合中获得一个文件流 FileItemStream fileItemStream = fileItems.next(); String name = fileItemStream.getFieldName();// 界面document的name值 InputStream stream = fileItemStream.openStream(); // 过滤掉表单中的非文件域 if (!fileItemStream.isFormField() && fileItemStream.getName().length() > 0) { // 获得上传文件的文件名 String fileName = fileItemStream.getName(); // 获得文件输入流 BufferedInputStream in = new BufferedInputStream(stream); // 获得文件输出流 BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(new File(saveDir + System.getProperty("file.separator") + fileName))); // 开始把文件写到指定的上传文件夹 Streams.copy(in, out, true); response.getWriter().println("File upload successfully!!!");// 成功,到上传文件夹中看看,上传的东西齐了吗 } else { System.out.println("Form field " + name + " with value " + Streams.asString(stream) + " detected."); } } } } catch (Exception e) { e.printStackTrace(); } } public void init() throws ServletException { /* * 对上传文件夹和临时文件夹进行初始化 */ super.init(); String tmpPath = "d:" + System.getProperty("file.separator") + "tmpdir"; String savePath = "d:" + System.getProperty("file.separator") + "updir"; tmpDir = new File(tmpPath); saveDir = new File(savePath); if (!tmpDir.isDirectory()) tmpDir.mkdir(); if (!saveDir.isDirectory()) saveDir.mkdir(); }
}
2.3.3 ServletFileUpload
此种方法需要临时文件路径
//上传路径File file = new File("C:/upload");
//临时文件路径File tempFile = new File("C:/uploadtemp");if(!file.exists()) {file.mkdir();
}if(!tempFile.exists()) {tempFile.mkdir();
}
//判断 request 是一个文件上传的 request//通过 ServletFileUpload 类的静态方法 isMultipartContent 来判断if(ServletFileUpload.isMultipartContent(request)) {//用 DiskFileItemFactory 创建新的 file items (只是临时的)//DiskFileItemFactory 创建FileItem 实例,并保存其内容在<b>内存</b>或者<b>硬盘中</b>//通过一个阀值来决定这个 FileItem 实例是存放在<b>内存</b>或者<b>硬盘中</b>DiskFileItemFactory factory = new DiskFileItemFactory();//设置阀值大小//不设置的话,默认10k//超过这个阀值,FileItem将直接写入到磁盘factory.setSizeThreshold(1024*10);//设置临时文件夹//不设置,默认为系统默认Temp文件路径,调用 System.getProperty("java.io.tmpdir") 获取//超过阀值的 FileItem 实例将存放在这个目录中factory.setRepository(tempFile);//构造servletFileUpload 的实例,该实例提供工厂模式创建FileItem的DiskFileItemFactory实例ServletFileUpload fileUpload = new ServletFileUpload(factory);//设置一个<b>完整的请求</b>允许的最大大小(注意是完整请求,包括非file类型的表单,比如Text类型)fileUpload.setSizeMax(10*1024*1024);//设置所允许的最大的单个上传文件大小(对应一个FileItem对象)//fileUpload.setFileSizeMax(10*1024*1024);try {//每一个FileItem 对应一个 request 请求中from表单中的 input 元素//解析 request 请求,将request中提交的值存入List数组List<FileItem> items = fileUpload.parseRequest(request);for(FileItem item : items) {//是不是一个文件上传组件if(!item.isFormField()) {String name = item.getName();System.out.println("name:" + name);System.out.println("length:" + item.getSize());item.write(new File("C:/upload/"+name));} else {String desc = item.getString("UTF-8");System.out.println("文件描述:" + desc);}}} catch (Exception e) {e.printStackTrace();}
} else {throw new RuntimeException("请设置form表单的enctype属性");
}
2.3.4 Commons FileUpLoad
//设置文件上传路径
String UploadFilePath = "d:/upload";
//限制文件大小//通过 request.getHeader("Content-Length") 获取request 请求内容长度来限制if(ServletFileUpload.isMultipartContent(request)) {//创建ServletFileUpload实例ServletFileUpload upload = new ServletFileUpload();try {//解析request 请求 并返回FileItemStream 的iterator 实例FileItemIterator iter = upload.getItemIterator(req);while (iter.hasNext()) {FileItemStream item = iter.next();String name = item.getFieldName();InputStream stream = item.openStream();if (item.isFormField()) {System.out.println("Form field " + name + " with value "+ Streams.asString(stream) + " detected.");} else {System.out.println("File field " + name + " with file name "+ item.getName() + " detected.");// Process the input stream//System.out.println(Streams.asString(stream));System.out.println("shuru:");String filename = new Scanner(System.in).next();BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(new File("e:/upload"),"ez.zip")));BufferedInputStream bis = new BufferedInputStream(stream);byte[] buffer = new byte[1024];int len = -1;while (-1 != (len = bis.read(buffer))){bos.write(buffer,0,len);}bis.close();bos.flush();bos.close();PrintWriter out = resp.getWriter();out.write("完成");System.out.println("wanchengle ");}}} catch (FileUploadException e) {e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.}
} else {throw new RuntimeException("请设置form表单的enctype属性");
}
2.3.5 java自带api FTPClient
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient; /** * Java自带的API对FTP的操作 */
public class Ftp { /** * 本地文件名 */ private String localfilename; /** * 远程文件名 */ private String remotefilename; /** * FTP客户端 */ private FtpClient ftpClient; public void connectServer(String ip, int port, String user, String password, String path) { try { /* ******连接服务器的两种方法*******/ //第一种方法
// ftpClient = new FtpClient();
// ftpClient.openServer(ip, port); //第二种方法 ftpClient = new FtpClient(ip); ftpClient.login(user, password); // 设置成2进制传输 ftpClient.binary(); System.out.println("login success!"); if (path.length() != 0){ //把远程系统上的目录切换到参数path所指定的目录 ftpClient.cd(path); } ftpClient.binary(); } catch (IOException ex) { ex.printStackTrace(); throw new RuntimeException(ex); } } public void closeConnect() { try { ftpClient.closeServer(); System.out.println("disconnect success"); } catch (IOException ex) { System.out.println("not disconnect"); ex.printStackTrace(); throw new RuntimeException(ex); } } public void upload(String localFile, String remoteFile) { this.localfilename = localFile; this.remotefilename = remoteFile; TelnetOutputStream os = null; FileInputStream is = null; try { //将远程文件加入输出流中 os = ftpClient.put(this.remotefilename); //获取本地文件的输入流 File file_in = new File(this.localfilename); is = new FileInputStream(file_in); //创建一个缓冲区 byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); } System.out.println("upload success"); } catch (IOException ex) { System.out.println("not upload"); ex.printStackTrace(); throw new RuntimeException(ex); } finally{ try { if(is != null){ is.close(); } } catch (IOException e) { e.printStackTrace(); } finally { try { if(os != null){ os.close(); } } catch (IOException e) { e.printStackTrace(); } } } }public void download(String remoteFile, String localFile) { TelnetInputStream is = null; FileOutputStream os = null; try { //获取远程机器上的文件filename,借助TelnetInputStream把该文件传送到本地。 is = ftpClient.get(remoteFile); File file_in = new File(localFile); os = new FileOutputStream(file_in); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); } System.out.println("download success"); } catch (IOException ex) { System.out.println("not download"); ex.printStackTrace(); throw new RuntimeException(ex); } finally{ try { if(is != null){ is.close(); } } catch (IOException e) { e.printStackTrace(); } finally { try { if(os != null){ os.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
2.4 下载
2.4.1 页面下载
<h1>通过链接下载文件</h1>
<a href="/day06/download/cors.zip">压缩包</a>
<a href="/day06/download/1.png">图片</a>
这是因为通过超链接下载文件时,如果浏览器可以识别该文件格式,浏览器就会直接打开。只有浏览器不能识别该文件格式的时候,才会实现下载
2.4.2 java代码示例
response,setContentType()
内容类型 |
文件扩展名 |
描述 |
application/msword |
doc dot rtf wiz |
Microsoft Word |
application/octet-stream bin |
dms lha lzh exe class |
可执行程序 |
application/pdf |
|
Adobe Acrobat |
application/postscript |
ai eps ps |
PostScript |
appication/powerpoint |
ppt |
Microsoft Powerpoint |
application/vnd.ms-powerpoint | pot ppa pps ppt pwz | |
application/vnd.visio | vsw vsx vtx vdx vsd vss vst | |
appication/rtf |
rtf |
rtf 格式 |
application/x-rtf | rtf | |
application/x-javascript | mocha js ls | |
application/x-compress |
z |
unix 压缩文件 |
application/x-msdownload | exe dll | |
application/x-gzip |
gz |
gzip |
application/x-gtar |
gtar |
tar 文档 (gnu 格式 ) |
application/x-shockwave-flash |
swf mfp |
MacroMedia Flash |
application/x-tar |
tar |
tar(4.3BSD) |
application/zip |
zip |
winzip |
audio/basic |
au snd |
sun/next 声音文件 |
audio/mpeg |
mpeg mp2 mp2v |
Mpeg 声音文件 |
video/x-mpeg | m1v m2v mpe mps | |
audio/rn-mpeg | mpga | |
video/mpg | mpv mpeg | |
video/mpeg | mpv2 | |
audio/x-aiff |
mid midi rmf |
Midi 格式 |
audio/aiff | aif aifc aiff | |
audio/x-pn-realaudio |
ram ra rmm |
Real Audio 声音 |
audio/x-pn-realaudio-plugin |
rpm |
Real Audio 插件 |
audio/x-wav |
wav |
Microsoft Windows 声音 |
application/x-x509-ca-cert | crt der cer | |
image/cgm |
cgm |
计算机图形元文件 |
image/gif |
gif |
COMPUSERVE GIF 图像 |
image/tiff | tif tiff | |
image/jpeg |
jpeg jpg jpe jfif |
JPEG 图像 |
image/png |
png |
PNG 图像 |
java/* | class | |
text/html |
html stm xhtml htm htx jsp plg |
|
text/plain |
txt sol sor |
|
text/xml |
xml vml vxml wsdl xdr sq xql xquery xsd xsl xslt biz cml dcd dtd ent fo math mml mtx rdf spp svg tld tsd mtx |
|
text/json |
json字符串 |
|
text/css | css |
方式一:
public HttpServletResponse download(String path, HttpServletResponse response) {try {// path是指欲下载的文件的路径。File file = new File(path);// 取得文件名。String filename = file.getName();// 取得文件的后缀名。String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();// 以流的形式下载文件。InputStream fis = new BufferedInputStream(new FileInputStream(path));byte[] buffer = new byte[fis.available()];fis.read(buffer);fis.close();// 清空responseresponse.reset();// 设置response的Headerresponse.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));response.addHeader("Content-Length", "" + file.length());OutputStream toClient = new BufferedOutputStream(response.getOutputStream());response.setContentType("application/octet-stream");toClient.write(buffer);toClient.flush();toClient.close();} catch (IOException ex) {ex.printStackTrace();}return response;}
方式二:
public void downloadLocal(HttpServletResponse response) throws FileNotFoundException {// 下载本地文件String fileName = "Operator.doc".toString(); // 文件的默认保存名// 读到流中InputStream inStream = new FileInputStream("c:/Operator.doc");// 文件的存放路径// 设置输出的格式response.reset();response.setContentType("bin");response.addHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");// 循环取出流中的数据byte[] b = new byte[100];int len;try {while ((len = inStream.read(b)) > 0)response.getOutputStream().write(b, 0, len);inStream.close();} catch (IOException e) {e.printStackTrace();}
方式三
public void downloadNet(HttpServletResponse response) throws MalformedURLException {// 下载网络文件int bytesum = 0;int byteread = 0;URL url = new URL("windine.blogdriver.com/logo.gif");try {URLConnection conn = url.openConnection();InputStream inStream = conn.getInputStream();FileOutputStream fs = new FileOutputStream("c:/abc.gif");byte[] buffer = new byte[1204];int length;while ((byteread = inStream.read(buffer)) != -1) {bytesum += byteread;System.out.println(bytesum);fs.write(buffer, 0, byteread);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
方式四(支持在线打开文件的一种方式)
public void downLoad(String filePath, HttpServletResponse response, boolean isOnLine) throws Exception {File f = new File(filePath);if (!f.exists()) {response.sendError(404, "File not found!");return;}BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));byte[] buf = new byte[1024];int len = 0;response.reset(); // 非常重要if (isOnLine) { // 在线打开方式URL u = new URL("file:///" + filePath);response.setContentType(u.openConnection().getContentType());response.setHeader("Content-Disposition", "inline; filename=" + f.getName());// 文件名应该编码成UTF-8} else { // 纯下载方式response.setContentType("application/x-msdownload");response.setHeader("Content-Disposition", "attachment; filename=" + f.getName());}OutputStream out = response.getOutputStream();while ((len = br.read(buf)) > 0)out.write(buf, 0, len);br.close();out.close();}
JSP基础:(7)jsp分页与文件上传下载相关推荐
- 基于华为云obs实现文件上传下载(技术栈mysql+springboot+Maven+jsp+java)的技术分享
基于华为云obs实现文件上传下载(技术栈mysql+springboot+jsp+java)的技术分享 obs实现文件上传下载 前言 一.OBS是什么? 二.使用步骤 1.1 前期准备 2 工具的内容 ...
- spring boot基础教程之文件上传下载
一文件上传 文件上传主要分以下几个步骤: (1)新建maven java project: (2)在pom.xml加入相应依赖: (3)新建一个文件上传表单页面; (4)编写controller; ( ...
- SB_5_瑞吉外卖_4_文件上传下载_菜品新增_菜品分页查询_菜品修改
瑞吉外卖-Day04 课程内容 文件上传下载 菜品新增 菜品分页查询 菜品修改 1. 文件上传下载 1.1 上传介绍 1.1.1 概述 文件上传,也称为upload,是指将本地图片.视频.音频等文件上 ...
- 前后端分离 -- 深入浅出 Spring Boot + Vue + ElementUI 实现相册管理系统【文件上传 分页 】 文件上传也不过如此~
前后端分离 – 深入浅出系列 Spring Boot + Vue + ElementUI 实现相册管理系统[文件上传 分页 ] 文件上传也不过如此~ 引言 Hello,我是Bug终结者,一名热爱后端J ...
- java 瑞吉外卖day4及补全功能 文件上传下载 菜品分页查询 Dto类 菜品状态修改 菜品停售以及菜品删除
文件上传下载 文件下载介绍 文件上传代码实现 服务端上传: @RestController @RequestMapping("/common") @Slf4j public cla ...
- salesforce 零基础学习(四十二)简单文件上传下载
项目中,常常需要用到文件的上传和下载,上传和下载功能实际上是对Document对象进行insert和查询操作.本篇演示简单的文件上传和下载,理论上文件上传后应该将ID作为操作表的字段存储,这里只演示文 ...
- 渗透测试-文件上传/下载/包含
渗透测试-文件上传/下载/包含 概述 一.常见校验上传文件的方法 客户端校验 服务器端校验 1.校验请求头 content-type字段 2. 正则匹配来判断文件幻数(文件头)内容是否符合要求 3. ...
- Java实现FTP批量大文件上传下载
用Java实现FTP批量大文件上传下载 <iframe id="I0_1416224567509" style="margin: 0px; padding: 0px ...
- SpringMVC之拦截器和文件上传下载
过滤器与拦截器的区别:拦截器是AOP思想的具体应用. 过滤器 : servlet规范中的一部分,任何java web工程都可以使用 在url-pattern中配置了/*之后,可以对所有要访问的资源进行 ...
最新文章
- 蘑菇模拟器TV版 for Android,安卓NES模拟器TV版下载
- C++实现输入两个字符串,从第一字符串中删除第二个字符串中所有的字符
- javascript回调函数(模式)原理和示例深入分析
- LOJ #6358 前夕 (组合计数、容斥原理)
- docker部署项目,对镜像,容器的操作
- php k线 形态识别,趋势追踪,从设计交易系统开始(七)——形态识别,不只有K线...
- Java中sum和Sum相同吗,Java认为变量Sum 和sum相同。
- python接口测试第二期_Python接口测试实战2 - 使用Python发送请求
- 获取activemq 队列所有数据_ActiveMQ的应用
- python 批量重命名文件_Python批量重命名文件的方法
- Inside the Linux Operating System[1]
- c#类似跑马灯抽签小程序
- 测试用例入门(二) - 使用等价类划分法编写测试用例
- solidworks工程图剖视图没有从默认的A开始解决办法
- 基于大数据的数据仓库-数据仓库的概念
- python调用webservice服务
- windows10常见故障排查
- div 自定义拉宽_纯Css实现Div高度根据自适应宽度(百分比)调整
- (二)WebService之调用soap服务
- Tossing Bad Mupd Msg Pid In The Alert.Log