jsp实现文件上传和下载(代码及说明)
- 格式:docx
- 大小:20.60 KB
- 文档页数:12
用JSP实现拖拽上传文件和文件夹JSP(JavaServer Pages)是一种动态网页技术,允许将Java代码嵌入到HTML页面中。
拖拽上传文件和文件夹是一种常见的网页交互功能,可以使用JSP来实现。
在实现拖拽上传文件和文件夹功能之前,首先需要了解一下拖拽上传的基本原理。
在HTML中,可以通过Drag and Drop API来获取拖拽的文件和文件夹。
然后,可以使用JavaScript将拖拽的文件和文件夹发送到服务器端,服务器端可以使用JSP来处理这些文件和文件夹。
以下是一个基本的实现拖拽上传文件的JSP页面的示例:```htmlpageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>拖拽上传文件</title><script>function handleDrop(event)event.preventDefault(; // 禁止浏览器打开文件var files = event.dataTransfer.files;//遍历上传的文件for (var i = 0; i < files.length; i++)var file = files[i];// 创建FormData对象,用于发送文件到服务器var formData = new FormData(;formData.append("file", file);// 创建一个XMLHttpRequest对象,发送文件到服务器var xhr = new XMLHttpRequest(;xhr.open("POST", "upload.jsp", true);xhr.onreadystatechange = functioif (xhr.readyState == 4 && xhr.status == 200)//上传成功console.log(xhr.responseText);}};xhr.send(formData);}}</script></head><body ondragover="event.preventDefault(;"ondrop="handleDrop(event);"><h1>拖拽上传文件</h1><p>将文件拖拽到此处上传</p></body></html>```当文件被拖拽到页面的时候,`handleDrop(`函数会被调用。
用JSP编写文件上传袁毅:2000-10-23如果你曾用VB编写文件上传的组件的话,那么用JAVA编写文件上传的JAVABEAN十分容易。
下面的例子只是一个简版package yuanyifileup;import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.PageContext;public class yuanyifileup{private ServletRequest request;private ServletResponse response;private ServletConfig config;ServletInputStream DATA;int FormSize;File f1;FileOutputStream os;DataInputStream is;String filename;byte[] b;byte t;boolean flag=false;public yuanyifileup(){ }public void initialize(ServletConfig config,HttpServletRequest request,HttpServlet Response response) throws IOException{this.request=request;this.response=response;this.config=config;DATA = request.getInputStream();FormSize=request.getContentLength();}public void initialize(PageContext pageContext) throws IOException{request=pageContext.getRequest();response=pageContext.getResponse();config=pageContext.getServletConfig();DATA = request.getInputStream();FormSize=request.getContentLength(); }public boolean setFilename(String s) {try{File f1=new File(s);os=new FileOutputStream(f1);}catch(IOException e){return(false);}return(true);}public void getByte(){int i=0;try{is=new DataInputStream(DATA);b=new byte[FormSize];while (true){try{t=is.readByte();b[i]=t;i++;}catch(EOFException e) { break;}}is.close();}catch(IOException e) {}}public boolean save() {int i=0,start1=0,start2=0; String temp="";if (!flag){getByte();flag=true;}try{temp=new String(b,"ISO8859_1");}catch(UnsupportedEncodingException e) {return(false);}start1=temp.indexOf("image/");temp=temp.substring(start1);start1=temp.indexOf("");temp=temp.substring(start1+4);start2=temp.indexOf(";");if (start2!=-1){temp=temp.substring(0,start2);}try{byte[] img=temp.getBytes("ISO8859_1");for (i=0;i<img.length;i++){ os.write(img[i]); }os.close();}catch(IOException e){return(false);}return(true);}如果有不明白的发E-Mail:yymailbox@.Bye }。
Java⽂件上传与⽂件下载实现⽅法详解本⽂实例讲述了Java⽂件上传与⽂件下载实现⽅法。
分享给⼤家供⼤家参考,具体如下:Java⽂件上传数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传。
⽂件上传是数据上传的⼀种特例,指客户端向服务器上传⽂件。
即将保存在客户端的⽂件上传⼀个副本到服务器,并保存在服务器中。
1、上传表单要求⽂件上传要求客户端提交特殊的请求——multipart请求,即包含多部分数据的请求。
必须将<form/>标签的enctype属性值设为“multipart/form-data”,enctype表⽰encodingType,及编码类型由于客户端上传⽂件的⼤⼩是不确定的,所以http协议规定,⽂件上传的数据要存放于请求正⽂中,不能出现在URL地址栏内。
也就是说,想要上传⽂件必须提交POST请求。
表单中要有<input type="file" />标签注意:multipart/form-data请求与普通请求不同2、下载⽂件上传jar包并查看官⽅⽂档选择Commons中的FileUpload项⽬,并下载jar包和源⽂件查看FileUpload的⼯作⽅式查看FileUpload项⽬的API3、使⽤第三⽅jar包上传⽂件public class RegisterServlet extends HttpServlet {private static final long serialVersionUID = 1L;public RegisterServlet() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.getWriter().append("Served at: ").append(request.getContextPath());}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//第⼀步、判断请求是否为multipart请求if(!ServletFileUpload.isMultipartContent(request)) {throw new RuntimeException("当前请求只⽀持⽂件上传");}try {//第⼆步、创建FileItem⼯⼚DiskFileItemFactory factory = new DiskFileItemFactory();//设置临时⽂件存储⽬录String path = this.getServletContext().getRealPath("/Temp");File temp = new File(path);factory.setRepository(temp);//单位:字节。
1.最直接最简单的,方式是把文件地址直接放到html页面的一个链接中。
这样做的缺点是把文件在服务器上的路径暴露了,并且还无法对文件下载进行其它的控制(如权限)。
这个就不写示例了。
2.在服务器端把文件转换成输出流,写入到response,以response把文件带到浏览器,由浏览器来提示用户是否愿意保存文件到本地。
(示例如下)
3.既然是JSP的话,还有一种方式就是用Applet来实现文件的下载。
不过客户首先得信任你的这个Applet小程序,由这个程序来接受由servlet发送来的数据流,并写入到本地。
servlet端示例
JApplet端示例
4.顺便把JApplet上传文件的代码也贴上来. JApplet端示例
servlet端代码示例
总结:在文件的传输中是流的形式存在的,在硬盘上是文件的形式存在的。
我们要做的只是通过HttpServletRequest和HttpServletResponse,或者是response和request来发送流和读取流。
以及把文件转换成流或把流转换成文件的操作。
一、安装篇jspSmartUpload是由网站开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的JSP文件中。
该组件有以下几个特点:1、使用简单。
在JSP文件中仅仅书写三五行JAVA代码就可以搞定文件的上传或下载,方便。
2、能全程控制上传。
利用jspSmartUpload组件提供的对象及其操作方法,可以获得全部上传文件的信息(包括文件名,大小,类型,扩展名,文件数据等),方便存取。
3、能对上传的文件在大小、类型等方面做出限制。
如此可以滤掉不符合要求的文件。
4、下载灵活。
仅写两行代码,就能把Web服务器变成文件服务器。
不管文件在Web服务器的目录下或在其它任何目录下,都可以利用jspSmartUpload进行下载。
5、能将文件上传到数据库中,也能将数据库中的数据下载下来。
这种功能针对的是MYSQL 数据库,因为不具有通用性,所以本文不准备举例介绍这种用法。
jspSmartUpload组件可以从网站上自由下载,压缩包的名字是jspSmartUpload.zip。
下载后,用WinZip或WinRAR将其解压到Tomcat的webapps目录下(本文以Tomcat服务器为例进行介绍)。
解压后,将webapps/jspsmartupload目录下的子目录Web-inf名字改为全大写的WEB-INF,这样一改jspSmartUpload类才能使用。
因为Tomcat对文件名大小写敏感,它要求Web应用程序相关的类所在目录为WEB-INF,且必须是大写。
接着重新启动Tomcat,这样就可以在JSP文件中使用jspSmartUpload组件了。
注意,按上述方法安装后,只有webapps/jspsmartupload目录下的程序可以使用jspSmartUpload组件,如果想让Tomcat服务器的所有Web应用程序都能用它,必须做如下工作:1.进入命令行状态,将目录切换到Tomcat的webapps/jspsmartupload/WEB-INF目录下。
1 JSP文件上传简单实例1、index.html代码:<html><head><title>上传图片</title></head><body><form action="do_upload.jsp" method="post" enctype="multipart/form-data"><input type="file" name="Photo"><input type="submit" value="上传"></form></body></html>2、使用到的函数和类说明File类文件和目录路径名的抽象表示形式,File(parent,child)方法根据parent 抽象路径名和child 路径名字符串创建一个新File实例FileOutputStream文件输出流,InputStream输入流,将输入数据看成一根管道,可以形象的将输入流比喻成管道的入口,而输出流比喻成管道的出口。
read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个字节数组中。
read() 从此输入流中读取一个数据字节。
write(int b) 将指定字节写入此文件输出流,write(byte[] b, int off, int len) 将指定字节数组中从偏移量off 开始的len 个字节写入此文件输出流。
write(byte[] b) 将 b.length 个字节从指定字节数组写入此文件输出流中Random.readLine()逐行读入,Random.seek(int pos)设置到此文件开头测量到的文件指针偏移量,该位置发生下一个读取和写入操作,Random.getFilePointer()返回此文件当前偏移量,Random.readByte()此方法从该文件的当前文件指针开始读取第一个字节。
特点:1.可以多文件上传;2.返回上传后的文件名;3.form表单中的其他参数也可以得到。
先贴上传类,JspFileUploadpackage com.vogoal.util;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Hashtable;import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; /** vogoalAPI 1.0* Auther SinNeR@* by * mail: vogoals@hotm *//*** JSP上传文件类** @author SinNeR* @version 1.0*/public class JspFileUpload {/** request对象*/private HttpServletRequest request = null;/** 上传文件的路径*/private String uploadPath = null;/** 每次读取得字节的大小*/private static int BUFSIZE = 1024 * 8;/** 存储参数的Hashtable */private Hashtable paramHt = new Hasptable();/** 存储上传的文件的文件名的ArrayList */private ArrayList updFileArr = new ArrayList();/*** 设定request对象。
** @param request* HttpServletRequest request对象*/public void setRequest(HttpServletRequest request) {this.request = request;}/*** 设定文件上传路径。
** @param path* 用户指定的文件的上传路径。
*/public void setUploadPath(String path) {this.uploadPath = path;}/*** 文件上传处理主程序。
�������B ** @return int 操作结果0 文件操作成功;1 request对象不存在。
2 没有设定文件保存路径或者文件保存路径不正确;3* 没有设定正确的enctype;4 文件操作异常。
*/public int process() {int status = 0;// 文件上传前,对request对象,上传路径以及enctype进行check。
status = preCheck();// 出错的时候返回错误代码。
if (status != 0)return status;try {// ��参数或者文件名�u�� String name = null;// 参数的valueString value = null;// 读取的流是否为文件的标志位boolean fileFlag = false;// 要存储的文件。
File tmpFile = null;// 上传的文件的名字String fName = null;FileOutputStream baos = null;BufferedOutputStream bos = null;// ��存储参数的HashtableparamHt = new Hashtable();updFileArr = new ArrayList();int rtnPos = 0;byte[] buffs = new byte[BUFSIZE * 8];// �取得ContentTypeString contentType = request.getContentType();int index = contentType.indexOf("boundary=");String boundary = "--" + contentType.substring(index + 9);String endBoundary = boundary + "--";// �从request对象中取得流。
ServletInputStream sis = request.getInputStream();// 读取1行while ((rtnPos = sis.readLine(buffs, 0, buffs.length)) != -1) { String strBuff = new String(buffs, 0, rtnPos);// 读取1行数据�n��if (strBuff.startsWith(boundary)) {if (name != null && name.trim().length() > 0) {if (fileFlag) {bos.flush();baos.close();bos.close();baos = null;bos = null;updFileArr.add(fName);} else {Object obj = paramHt.get(name);ArrayList al = new ArrayList();if (obj != null) {al = (ArrayList) obj;}al.add(value);System.out.println(value);paramHt.put(name, al);}}name = new String();value = new String();fileFlag = false;fName = new String();rtnPos = sis.readLine(buffs, 0, buffs.length);if (rtnPos != -1) {strBuff = new String(buffs, 0, rtnPos);if (strBuff.toLowerCase().startsWith("content-disposition: form-data; ")) {int nIndex = strBuff.toLowerCase().indexOf("name=\"");int nLastIndex = strBuff.toLowerCase().indexOf("\"", nIndex + 6);name = strBuff.substring(nIndex + 6, nLastIndex); }int fIndex = strBuff.toLowerCase().indexOf("filename=\"");if (fIndex != -1) {fileFlag = true;int fLastIndex = strBuff.toLowerCase().indexOf("\"", fIndex + 10);fName = strBuff.substring(fIndex + 10, fLastIndex); fName = getFileName(fNam e);if (fName == null || fName.trim().length() == 0) { fileFlag = false;sis.readLine(buffs, 0, buffs.length);sis.readLine(buffs, 0, buffs.length);sis.readLine(buffs, 0, buffs.length);continue;}else{fName = getFileNameByTime(fName);sis.readLine(buffs, 0, buffs.length);sis.readLine(buffs, 0, buffs.length);}}}} else if (strBuff.startsWith(endBoundary)) {if (name != null && name.trim().length() > 0) {if (fileFlag) {bos.flush();baos.close();bos.close();baos = null;bos = null;updFileArr.add(fName);} else {Object obj = paramHt.get(name);ArrayList al = new ArrayList();if (obj != null) {al = (ArrayList) obj;}al.add(value);paramHt.put(name, al);}}} else {if (fileFlag) {if (baos == null && bos == null) {tmpFile = new File(uploadPath + fName);baos = new FileOutputStream(tmpFile);bos = new BufferedOutputStream(baos);}bos.write(buffs, 0, rtnPos);baos.flush();} else {System.out.println("test :" + value + "--" + strBuff); value = value + strBuff;}}}} catch (IOException e) {status = 4;}return status;}private int preCheck() {int errCode = 0;if ( request == null )return 1;if ( uploadPath == null || uploadPath.trim().length() == 0 ) return 2;else{File tmpF = new File(uploadPath);if (!tmpF.exists())return 2;}String contentType = request.getContentType();if ( contentType.indexOf("multipart/form-data") == -1 )return 3;return errCode;}public String getParameter(String name){String value = "";if ( name == null || name.trim().length() == 0 )return value;value = (paramHt.get(name) ==null)?"":(String)((ArrayList)paramHt.get(name)).get(0);return value;}public String[] getParameters(String name){if ( name == null || name.trim().length() == 0 )return null;if ( paramHt.get(nam e) == null )return null;ArrayList al = (ArrayList)paramHt.get(nam e); String[] strArr = new String[al.size()];for ( int i=0;i<al.size();i++ )strArr[i] = (String)al.get(i);return strArr;}public int getUpdFileSize(){return updFileArr.size();}public String[] getUpdFileNames(){String[] strArr = new String[updFileArr.size()]; for ( int i=0;i<updFileArr.size();i++ )strArr[i] = (String)updFileArr.get(i);return strArr;}private String getFileName(String input){int fIndex = stIndexOf("\\");if (fIndex == -1) {fIndex = stIndexOf("/");if (fIndex == -1) {return input;}}input = input.substring(fIndex + 1);return input;}private String getFileNameByTime(String input){int index = input.indexOf(".");Date dt = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");return input.substring(0,index) + sdf.format(dt) + input.substring(index);}}说明:这个类基本解决了上一贴的上一贴说的存在的bug和不足。