1 导入jar包
2 文件上传
<form action="uploadServlet" method="post" encType="multipart/form-data"> <input type="file" name="f"><br> <input type="text" name="username"><br> <input type="submit" value="上传"> </form>
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory); try { List<FileItem> items = fileUpload.parseRequest(request); for (FileItem fileItem : items) { if(!fileItem.isFormField()){ String name = fileItem.getName(); System.out.println(name+"-----getName"); name = name.substring(name.lastIndexOf("\\")+1); System.out.println(name); FileOutputStream fos = new FileOutputStream("d:/upload/" + name); IOUtils.copy(fileItem.getInputStream(), fos); } } } catch (FileUploadException e) { e.printStackTrace(); } }
首先文件上传的中有三个核心类,分别是DiskFileIItemFactory 和 servletFileUpload 还有 FileItem ,前面的两个核心类都是写死的,
然后重点说一下,调用ServletFileUpload的parseRequest()方法,得到的这个集合,这个集合中的泛型就是表单项。
类似与上面的表单就有两个表单项,那么我们遍历这个集合,然后判断是否是文件上传的表单项。
通过那个if的条件进行判断,当里面的方法返回值是true的时候,那么就代表这个表单项不是文件上传的表单项,
所以我在判断的时候,如果返回值为!那么这个就是我的上传表单项,fileItem有个方法 getName,这个方法根据浏览器的不同,
有时候上传的值也是不同的。IE浏览器上传文件之后就是这个文件的路径名+文件本身的名,例如a.txt,上传就是文件的路径+a.txt,
但是有的浏览器上传文件的getname就是文件本身的名称,例如就是a.txt,没有文件的路径。
所以为了保险起见,我们给name进行一下处理,进行一下切割,找到最后一个\ (需要进行转义一下,转义之后是\\),然后我创建一个文件输出流,然后调用IoUtils.copy ,
传入文件输入流,和文件输出流,其实这个方法的实现底层就是io流读写之间的转换。
String name = item.getName(); // 上传文件名称 System.out.println(name); name = name.substring(name.lastIndexOf("\\") + 1); System.out.println("上传组件:" + name); String msg = item.getString(); System.out.println(msg); //获取上传文件内容,完成文件 上传操作 InputStream is = item.getInputStream(); byte[] b = new byte[1024]; int len = -1; FileOutputStream fos = new FileOutputStream("d:/upload/" + name); while ((len = is.read(b)) != -1) { fos.write(b, 0, len); } fos.close(); is.close(); IOUtils.copy(item.getInputStream(), fos);
其实我们在实际的项目中,我们文件的上传路径不能使用硬编码的方式,我们一般在webRoot下创建一个上传的文件夹,temp,
请注意,最好不要放在web-inf 和 mat-inf中。然后我创建DiskFileItemFactory使用另一构构造方法。
File file = new File(this.getServletContext().getRealPath("/temp")); // 获取temp目录部署到tomcat后的绝对磁盘路径 DiskFileItemFactory factory = new DiskFileItemFactory(1024 * 100, file); // 使用默认的.
构造方法中的参数一个是上传文件的最大的值,另一个是上传文件的临时存储目录,首先,当我们使用无参数的构造的时候,
上传文件是默认存储在内存中的,类似与小的文本文档存储在内存中是可以的,
但是如果文件过大,那么直接存储在内存中效率低下,那么我们需要构建一个临时的文件存储目录。
下面的这张图片说一下fileItem的一些常用api。
下面说一下文件下载
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.得到要下载 的文件名称 String filename = request.getParameter("filename"); filename = new String(filename.getBytes("iso8859-1"), "utf-8"); // 解决中文乱码 // 2.在d:/upload目录下查找这个文件是否存在 File file = new File("d:/upload/" + filename); if (file.exists()) { // /文件存在,完成下载 // 下载注意事项1--设置下载文件的mimeType String mimeType = this.getServletContext().getMimeType(filename); response.setContentType(mimeType); String agent = request.getHeader("user-agent"); if (agent.contains("MSIE")) { // IE浏览器 filename = URLEncoder.encode(filename, "utf-8"); } else if (agent.contains("Firefox")) { // 火狐浏览器 BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else { // 其它浏览器 filename = URLEncoder.encode(filename, "utf-8"); } // 下载注意事项2--永远是下载 response.setHeader("content-disposition", "attachment;filename=" + filename); FileInputStream fis = new FileInputStream(file); // 读取要下载文件的内容 OutputStream os = response.getOutputStream(); // 将要下载的文件内容通过输出流写回到浏览器端. int len = -1; byte[] b = new byte[1024 * 100]; while ((len = fis.read(b)) != -1) { os.write(b, 0, len); os.flush(); } os.close(); fis.close(); } else { throw new RuntimeException("下载资源不存在."); } }
<body> <a href='${pageContext.request.contextPath}/download?filename=a.bmp'>a.bmp</a><br> <a href='${pageContext.request.contextPath}/download?filename=a.doc'>a.doc</a><br> <a href='${pageContext.request.contextPath}/download?filename=a.txt'>a.txt</a><br> <a href='${pageContext.request.contextPath}/download?filename=天空.mp3'>天空.mp3 </a><br> </body>
相关推荐
jsp+javabean+servlet+ajax,数据分页显示,使用SERVLET完成增删改查操作, 文件、图片上传,使用smartUpload组件完成上传操作。 MVC模式 非常适合初学者;
JSP+servlet文件上传简单案例 JSP+servlet文件上传简单案例
jsp+servlet实现文件上传和下载,需要使用commons-fileupload,commons-io.jar java库文件
使用mvc模式设计,jsp+servlet开发,同时可以上传两个文件,也可以自己修改下代码上传多个文件,在Servlet中使用开源fileupload包实现文件上传功能
定点定时长音乐播放系统,带进度条的文件批量上传(jquery+plupload+jsp+servlet),该系统没有使用数据库,不需要过多的配置就可以使用,在项目中有一个文档,说明该系统的使用方法与注意事项。
jsp+servlet文件上传数据库和下载
JSP+servlet实现的文件上传, 有详细注释, 需要MyEclipse5.5或更高
实现的功能有:登陆,注册,管理员管理用户界面(冻结,解冻,注销),管理员管理文件界面(删除,审核(在做)),然后是用户管理自己的文件界面,有上传,下载,删除,在线编辑,修改,查询,分页功能。...
页面+处理的SERVLET代码 需要jspSmartUpload组件
完整的JSP+Servlet实现文件的上传下载
Java网站开发(jsp+servlet)笔记,里面还包括EL表达式,JSTL标签库的使用,网站文件上传的源代码截图等
本文实例为大家分享了JSP+Servlet实现文件上传到服务器功能的具体代码,供大家参考,具体内容如下 项目目录结构大致如下: 正如我在上图红线画的三个东西:Dao、service、servlet 这三层是主要的结构,类似 MVC ...
主要为大家详细介绍了Jsp+Servlet实现文件上传下载中的第一部分文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
《上传文件及预览,jsp +servlet 》这篇博客中用到的jar包和js
采用MVC模式,在jsp+servlet+service+DAO架构的基础上,实现了互联网上网络相册的绝大部分功能,如用户管理,相片分类,相册管理,相片的评论管理,上传及删除相片文件等。 附加java源代码
实现简单的文件上传功能。 在工程中加入io和upload组件的方法: Windows-preferences-Java-buildpath-userlibraries 右击工程名:buildpath-config buildpath-libraries-addlibraries-userliraries-next,加入包即可...
JSP+servlet文件上传 rar格式
功能: 发表文章 评论文章 照片上传 权限管理
项目详细请看这里 http://blog.csdn.net/qw765811529/article/details/50748599
图书管理:管理员对图书信息的添加、修改、删除和查询功能,包括图书详细信息、图片上传等。 其中包含系统使用前必读、包含课程设计报告,包含数据库sql文件,可以参考报告内容了解本系统的具体实现等。