JSPservlet文件上传
- 格式:doc
- 大小:30.00 KB
- 文档页数:3
用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(`函数会被调用。
文件上传的简单方法:(原理性的实验)1. <body><form action="upload" name="newForm"enctype="multipart/form-data" method="post">附件:<input type="file" name="file1"/><input type="submit" name="submit" value="submit"/> </form></body>2. public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {InputStream is = request.getInputStream(); //获得request的输入流FileOutputStream fos = new FileOutputStream(newFile("d:/testUpload.jpg"));byte[] b = new byte[1024];while(is.read(b)!=-1){fos.write(b);}is.close();fos.close();}使用commons-fileupload组件实现的基本上传:1.加jar包:commons-fileupload.jar, commons-io.jar2.JSP页面中增加form:<form enctype="multipart/form-data" method="post"action="uploadVideo"><input type="file" name="file1"/><input type="submit" name="submit1" value="提交"/> </form>3.增加servlet:public void doPost(HttpServletRequest request, HttpServletResponseresponse)throws ServletException, IOException {String tempDirectory = "d:/temp/"; //要在最后加上斜杠:temp/ 临时文件夹上传成功之前存放缓存的位置String fileDirectory = "d:/video/"; //要在最后加上斜杠:temp/ 上传成功后的文件所放的目录try {int sizeThreshold = 1024 * 64; //写满该大小的缓存后,存入硬盘中。
用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 }。
现就JA V A中文件上传与下载的实现方法总结如下:一、上传方法1.http方式:2)架包mons.fileupload.servlet.ServletFileUpload3)架包com.jspsmart.upload.SmartUpload4)架包jspupload5)传统fileinputstream,fileoutputstream方式6)struts框架支持2.FTP方式:1)sun的架包2)架包.ftp.FTPClient 比较好用3)架包.ftp.FTPClient二、下载方法1.http方式1)servlet+传统fileinputstream,fileoutputstream2)架包.ftp.FTPClient2.FTP方式:1)servlet+架包.ftp.FTPClient 比较好用下面就架包.ftp.FTPClient实现文件上传与下载。
代码如下:上传:JSP:<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <html><head><title>文件上传</title></head><body><form action="/struts2HibernateSpring/servlet/uploadServletA" method="post">文件位置:<input type="file" name="mfile"><br><input type="submit" value="提交"></form></body></html>SERVLET:package com.test;import java.io.FileOutputStream;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class UploadServletA extends HttpServlet {private static final long serialVersionUID = 1L;public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {try{request.setCharacterEncoding("utf-8");response.setCharacterEncoding("UTF-8");response.setContentType("text/html; charset=UTF-8");String myFile = request.getParameter("mfile"); //获取页面提交的文件int indexOf = stIndexOf("\\"); //获取最后一个“/”所在的索引位String fileName = myFile.substring(indexOf); //获取文件上传的文件名//创建输出流把指定的文件写入WEB工程的upload目录下(需要在WebRoot目录下创建upload目录)。
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()此方法从该文件的当前文件指针开始读取第一个字节。
js实现文件上传功能后台使用MultipartFile在前端使用JavaScript实现文件上传功能,可以通过使用`FormData`对象来实现。
首先,我们需要创建一个HTML表单,并添加一个文件输入字段。
```html<form id="uploadForm"><input type="file" name="file" id="fileInput"><button type="submit">上传</button></form>```接下来,在JavaScript中,我们可以监听表单的提交事件,并在事件处理程序中获取文件数据,并将其发送到后台。
```javascriptdocument.getElementById('uploadForm').addEventListener('subm it', function(event)event.preventDefault(; // 阻止表单默认提交行为var fileInput = document.getElementById('fileInput');var file = fileInput.files[0];var formData = new FormData(;formData.append('file', file);//发送文件数据到后台var xhr = new XMLHttpRequest(;xhr.open('POST', '/upload'); // 替换成你的后台接口地址xhr.send(formData);});```在后台使用Spring框架时,可以使用`MultipartFile`来接收上传的文件。
Java通用文件上传功能实现一、文件上传流程说明:Java文件上传功能是指在Java开发中,实现文件上传的功能,可以用于各种场景,如网站上传图片、文件管理系统等。
以下是一种常见的实现方式:1、创建一个包含文件上传功能的表单页面,用户可以选择要上传的文件并提交表单。
2、在后端Java代码中,接收表单提交的文件数据。
可以使用Apache Commons FileUpload库或Spring框架提供的MultipartFile类来处理文件上传。
3、对接收到的文件进行处理,可以将文件保存到服务器的指定位置,或者将文件存储到数据库中。
4、返回上传成功或失败的信息给用户。
二、代码实现,方案一:在Java中实现文件上传功能可以通过以下步骤来完成:1、创建一个HTML表单,用于选择要上传的文件:<form action="upload"method="post" enctype="multipart/form-data"> <input type="file" name="file" /><input type="submit" value="Upload" /></form>2、创建一个Servlet或者Controller来处理文件上传请求:@WebServlet("/upload")public class UploadServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) {// 获取上传的文件Part filePart = request.getPart("file");String fileName = filePart.getSubmittedFileName();// 指定上传文件的保存路径String savePath = "C:/uploads/" + fileName;// 将文件保存到指定路径filePart.write(savePath);// 返回上传成功的消息response.getWriter().println("File uploaded successfully!");}}3、配置web.xml(如果使用传统的Servlet方式)或者使用注解(如果使用Servlet 3.0+)来映射Servlet。
AjaxSubmit+Servlet表单⽂件上传和下载⼀、背景前段时间公司要求我做⼀个上传和下载固件的页⾯,以备硬件产品在线升级,现在我把这部分功能抽取出来作为⼀个Demo Project给⼤家分享。
话不多说,先看项⽬演⽰ -->⼆、源码前端js库:jquery-3.2.1.min.js,jquery.form.js(异步表单提交),jsviews.min.js(模板渲染)jsviews科普:jsviews是实现MVVM的js库,分为JsRender(渲染),JsViews(数据视图双向绑定),JsObservable (数据监听),有兴趣的同学可以去了解,这⾥只⽤到了渲染的功能。
1、下载页⾯ index.html<!DOCTYPE html><html><head><meta charset="UTF-8"><title>ajaxSubmit上传</title><link rel="shortcut icon" href="images/favicon.ico"><link rel="Bookmark" href="images/favicon.ico"><link rel="stylesheet" href="css/index.css"/><script type="text/javascript" src="js/jquery-3.2.1.min.js"></script><script type="text/javascript" src="js/jquery.form.js"></script><script type="text/javascript" src="js/jsviews.min.js"></script><script type="text/javascript" src="js/common.js"></script></head><body><h1>上传下载Demo</h1><h2>1、上传⽂件</h2><form id="addForm"><div><span>选择类型:</span><select name="code" id="code"><option value="0">普通开关</option><option value="1">插座</option></select></div><div><span>选择⽂件(⼩于5k):</span><input type="file" id="file" name="file"></div><div><button type="button" id="addConfirm" name="addConfirm">确定</button></div></form><h2>2、测试上传结果</h2><table id="tbBody"><thead><tr><td>类型</td><td>⽂件名</td><td>通过Servlet下载</td></tr></thead></table></body><script type="text/javascript" src="js/index.js"></script><!-- jsviews模板 --><script id="listTmpl" type="text/x-jsrender"><tr><td>{^{if code=='0'}}普通开关{{else code=='1'}}插座{{else}}数据错误{{/if}}</td><td>{{:fileName}}</td><td><a href="fileDownload?fileName={{:fileName}}">urlServlet</a></td></tr></script></html>2、公共js js/common.js//获取链接参数function getQueryString(name){var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");var r = window.location.search.substr(1).match(reg);if(r!=null)return unescape(r[2]); return null;}3、 js/index.js//提交表单function addSubmit(){var options={ url: "fileUpload",type:'post',datatype:'json', success: function (data) {var result = JSON.parse(data);if(result.code == "0000"){var pageBarTmpl = $.templates("#listTmpl");var html = pageBarTmpl.render(result.content);$("#tbBody").append(html);}else{alert(result.desc);} }}$("#addForm").ajaxSubmit(options);}//提交前检查function submitCheck(){var code = $("#code").val();if (!code) {alert("请选择类型");return false;}var file = $("#file").val();if (!file) {alert("请选择需要上传的固件");return false;}}//按钮触发$("#addConfirm").click(function(){if(submitCheck())addSubmit();});4、css/index.csstable th,table td{border:1px solid black;}form div{margin:5px;}后端使⽤到了commons-fileupload-1.3.1.jar,commons-io-2.4.jar以及gson-2.6.2.jar1、返回结果类 RspResult.java/*** 返回结果类* @author zhang**/public class RspResult{private String code; //返回码private String desc; //返回描述private Map<String,Object> content; //返回内容public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}public Map<String, Object> getContent() {return content;}public void setContent(Map<String, Object> content) {this.content = content;}}2、⾃定义异常类 MyException.java/*** ⾃定义异常* @author zhang**/public class MyException extends Exception{private static final long serialVersionUID = 3075956744530570774L;private String code; //错误码private String desc; //描述public MyException(String code, String desc) {super();this.code = code;this.desc = desc;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}}3、⽂件上传Servlet FileUpload.java/*** ⽂件上传类* 使⽤commons-fileupload⼯具包解析表单内容,捕获⾃定义异常* @author zhang**/public class FileUpload extends HttpServlet{private static final long serialVersionUID = -4700695646596658600L;private static final String SAVE_LOCATION = "/home/www/download/blog/ajaxUpload/"; //保存地址 @Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException { resp.setCharacterEncoding("UTF-8");RspResult result = new RspResult();result.setCode("0000");result.setDesc("success");try {DiskFileItemFactory factory = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(factory);upload.setFileSizeMax( 5*1024 ); //单个⽂件最⼤上传⼤⼩为5kupload.setSizeMax( 5*1024 ); //设置全部⽂件最⼤上传总⼤⼩为5kupload.setHeaderEncoding("utf-8"); //设置编码List<FileItem> fileItems = upload.parseRequest(req);Iterator<FileItem> iterator = fileItems.iterator();Map<String, Object> rspConent = new HashMap<>();DiskFileItem fileItem = null;//循环读取表单数据while (iterator.hasNext()) {FileItem item = iterator.next();if (!item.isFormField()) { //是否为⽂件类型,因为只有⼀个⽂件,所以单个引⽤就⾏fileItem = (DiskFileItem) item;rspConent.put(item.getFieldName(), item.getString());}}if(fileItem == null)throw new MyException("0001","⽆选择⽂件");String fileName = fileItem.getName();fileItem.write(new File(SAVE_LOCATION + fileName));rspConent.put("fileName", fileName);result.setContent(rspConent);} catch (FileUploadException e ) {result.setCode("0001");result.setDesc("⽂件上传⼤⼩为5k");e.printStackTrace();} catch (MyException e ) { //取得⾃定义异常结果result.setCode(e.getCode());result.setDesc(e.getDesc());} catch (Exception e) {result.setCode("0001");result.setDesc("未知错误");e.printStackTrace();}finally {PrintWriter out = null;try {out = resp.getWriter();} catch (IOException e) {e.printStackTrace();}out.write(new Gson().toJson(result));}}}4、⽂件下载Servlet FileDownload.java/*** ⽂件下载类,读取⽂件,以字节流形式写到response* @author admin**/public class FileDownload extends HttpServlet{private static final long serialVersionUID = -9135576688701595777L;private final String SAVE_LOCATION = "/home/www/download/blog/ajaxUpload/";@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException {InputStream in = null;try {String fileName = req.getParameter("fileName");in = new FileInputStream(SAVE_LOCATION+fileName);// 设置输出格式resp.setCharacterEncoding("utf-8");resp.addHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");// 读取数据byte[] b = new byte[100];int len = 0;while ((len = in.read(b)) > 0)resp.getOutputStream().write(b, 0, len);} catch (UnsupportedEncodingException e2) {e2.printStackTrace();} catch (FileNotFoundException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {try {if(in != null)in.close();} catch (IOException e) {e.printStackTrace();}}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}}配置1、项⽬配置 web.xml<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="/xml/ns/javaee" xmlns:jsp="/xml/ns/javaee/jsp" xmlns:web="/xml/ns/javaee/web-app_2_5.xsd" <display-name>upload-download-demo</display-name><welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list><servlet><servlet-name>fileUpload</servlet-name><servlet-class>com.yuejia.servlet.FileUpload</servlet-class></servlet><servlet-mapping><servlet-name>fileUpload</servlet-name><url-pattern>/fileUpload</url-pattern></servlet-mapping><servlet><servlet-name>fileDownload</servlet-name><servlet-class>com.yuejia.servlet.FileDownload</servlet-class></servlet><servlet-mapping><servlet-name>fileDownload</servlet-name><url-pattern>/fileDownload</url-pattern></servlet-mapping></web-app>2、tomcat配置url⽀持utf-8 server.xml<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>三、总结本Demo适合⼀次性上传⼩⽂件,多数情况下需要先上传⽂件再进⾏表单提交,视需求⽽定。
Jsp页面实现文件上传下载第1 页jsp页面实现文件上传代码开发的过程见用TOMCAT作简单的jsp web开发名称:jsp页面上传类作者:SinNeRMail:vogoals[at]特点:1可以多文件上传;2返回上传后的文件名;3form表单中的其他参数也可以得到。
先贴上传类,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*************************** by *mail:********************//*** 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对象。
总结JSP与servlet之间的传值JSP与servlet之间的传值有两种情况:JSP -> servlet,servlet -> JSP。
通过对象request和session (不考虑application)完成传值。
一、JSP -> servletJSP页面有3种方法向servlet传值:form表单、URL 、其他<!-- JSP page -->...<%......session.setAttribute("testSession","Hello session");reqeust.setAttribute("testRequest","Hello request");%><a href="JspServlet?action=toServlet">click me</a><form action="JspServlet?action=toServlet" method="post" name="form"><input name="username" type="test" /><input type="submit" value="submit"></form>...1、对于该JSP页面form表单的内容,如<input>标签,在servlet可用request.getParameter("username");获取。
2、URL:比如这里的<a>标签的href属性与<form>标签的action属性的值"JspServlet?action=toServlet",在servlet同样用request.getParameter("action")获取;所要注意的是这里的url 要和servlet在web.xml里的<url-pattern>标签的路径所对应。
UploadExample.jsp<%@ page contentType="text/html;charset=gb2312"%> <html><title><%= application.getServerInfo() %></title><body>上传文件程序应用示例<form action="doUpload.jsp" method="post"enctype="multipart/form-data"><%-- 类型enctype用multipart/form-data,这样可以把文件中的数据作为流式数据上传,不管是什么文件类型,均可上传。
--%>请选择要上传的文件<input type="file" name="upfile" size="50"><input type="submit" value="提交"></form></body></html>doUpload.jsp<%@ page contentType="text/html; charset=GBK" %> <%@ page import="java.io.*"%><%@ page import="java.util.*"%><%@ page import="javax.servlet.*"%><%@ page import="javax.servlet.http.*"%><html><head><title>upFile</title></head><body bgcolor="#ffffff"><%//定义上载文件的最大字节int MAX_SIZE = 102400 * 102400;// 创建根路径的保存变量String rootPath;//声明文件读入类DataInputStream in = null;FileOutputStream fileOut = null;//取得客户端的网络地址String remoteAddr = request.getRemoteAddr();//获得服务器的名字String serverName = request.getServerName();//取得互联网程序的绝对地址String realPath = request.getRealPath(serverName);realPath =realPath.substring(0,stIndexOf("\\"));//创建文件的保存目录rootPath = realPath + "\\upload\\";//取得客户端上传的数据类型String contentType = request.getContentType();try{if(contentType.indexOf("multipart/form-data") >= 0){ //读入上传的数据in = new DataInputStream(request.getInputStream()); int formDataLength = request.getContentLength();if(formDataLength > MAX_SIZE){out.println("<P>上传的文件字节数不可以超过" + MAX_SIZE + "</p>");return;}//保存上传文件的数据byte dataBytes[] = new byte[formDataLength];int byteRead = 0;int totalBytesRead = 0;//上传的数据保存在byte数组while(totalBytesRead < formDataLength){byteRead =in.read(dataBytes,totalBytesRead,formDataLength); totalBytesRead += byteRead;}//根据byte数组创建字符串String file = new String(dataBytes);//out.println(file);//取得上传的数据的文件名String saveFile =file.substring(file.indexOf("filename=\"") + 10); saveFile = saveFile.substring(0,saveFile.indexOf("\n")); saveFile = saveFile.substring(stIndexOf("\\") + 1,saveFile.indexOf("\""));int lastIndex = stIndexOf("=");//取得数据的分隔字符串String boundary = contentType.substring(lastIndex + 1,contentType.length());//创建保存路径的文件名String fileName = rootPath + saveFile;//out.print(fileName);int pos;pos = file.indexOf("filename=\"");pos = file.indexOf("\n",pos) + 1;pos = file.indexOf("\n",pos) + 1;pos = file.indexOf("\n",pos) + 1;int boundaryLocation = file.indexOf(boundary,pos) - 4; //out.println(boundaryLocation);//取得文件数据的开始的位置int startPos = ((file.substring(0,pos)).getBytes()).length; //out.println(startPos);//取得文件数据的结束的位置int endPos =((file.substring(0,boundaryLocation)).getBytes()).length; //out.println(endPos);//检查上载文件是否存在File checkFile = new File(fileName);if(checkFile.exists()){out.println("<p>" + saveFile + "文件已经存在.</p>"); }//检查上载文件的目录是否存在File fileDir = new File(rootPath);if(!fileDir.exists()){fileDir.mkdirs();}//创建文件的写出类fileOut = new FileOutputStream(fileName);//保存文件的数据fileOut.write(dataBytes,startPos,(endPos - startPos)); fileOut.close();out.println(saveFile + "文件成功上载.</p>");}else{String content = request.getContentType();out.println("<p>上传的数据类型不是multipart/form-data</p>");}}catch(Exception ex){throw new ServletException(ex.getMessage());}%></body></html>。
jsp用户上传头像、上传图片、邮件上传附件代码jsp教程用户上传头像、上传图片、邮件上传附件代码2. 页面表单的实现文件上传表单和普通表单有两个区别1) 需要文件上传字段<input type=”file” />2) form 表单的 enctype 属性需要指定为 multipart/form-data3. 服务器端解析request在 Servlet 中通过 request.getInputStream 获得表单上传数据,会发现数据是分段发送的由于自己写程序解析有难度,我们可以使用Apache 开发的开源组件Commons-fileupload需要导入 jar 包Commons-fileupload 和Commons-io4 . UploadServlet 中处理文件上传程序// 1. 创建工厂类DiskFileItemFactory factory = new DiskFileItemFactory();// 2. 创建FileUpload对象ServletFileUpload upload = new ServletFileUpload(factory);// 3. 判断是否是上传表单boolean b = upload.isMultipartContent(request);if(!b) {// 不是文件上传request.setAttribute("message", "对不起,不是文件上传表单!");request.getRequestDispatcher("/message.jsp").forward(requ est, response);return;}// 是文件上传表单// 4. 解析request,获得FileItem项List<FileItem> fileitems = upload.parseRequest(request); // 5. 遍历集合for(FileItem item : fileitems) {// 判断是不是普通字段if(item.isFormField()) {String name = item.getFieldName();String value = item.getString();// 手工的转换了value = new String(value.getBytes("iso-8859-1"),"utf-8"); System.out.println(name + "=" + value);} else {// 文件上传字段// 获得文件名String filename = item.getName();System.out.println(filename);filename = filename.substring(stIndexOf("")+1);System.out.println(filename);// 创建文件ServletContext context = getServletContext();String dir = context.getRealPath("WEN-INF/upload");File file = new File(dir, filename);file.createNewFile();// 获得流,读取数据写入文件InputStream in = item.getInputStream(); FileOutputStream fos = new FileOutputStream(file);int len;byte[] buffer = new byte[1024];while((len=in.read(buffer))>0)fos.write(buffer,0,len);fos.close();in.close();item.delete(); // 删除临时文件}二、文件上传处理细节1. 中文乱码问题1) 文件名中文乱码问题,解决办法:告诉文件上传组件以什么编码方式来解码文件名ServletUpload.setCharacterEncoding(“utf-8”);request. setCharacterEncoding(“utf-8”);2) 普通字段中文乱码问题fileitem.getString(“utf-8”);2. 临时文件对于大文件不能缓存在内存,需要缓存到硬盘,为了方便管理,我们需要设置临时文件存放目录// 设置临时文件的存放位置factory.setRepository(new File("d:/temp"));文件上传完毕需要删除临时文件,否则会导致服务器存在两份上传文件// 注意,需要先将流进行关闭,否则会导致临时文件无法删除out.close();in.close();// 删除临时文件fileitem.delete();3. 文件存放目录1) 目录需要隐藏,禁止外界直接访问2) 文件名需要保证不重复3) 文件应该分目录存放三、上传进度条1. 实现进度监听需要实现对文件上传进度的监听,需要给FileUpload 对象添加ProgressListener在upload方法中对与进度相关的数据进行处理upload.setProgressListener(new ProgressListener() {long num = 0;public void update(long bytesRead, long contentLength, int items) {long progress = bytesRead*100/contentLength;if(progress==num)return;num = progress;System.out.println("上传进度:" + progress + "%");// request.getSession().setAttribute("progress", progress);}});2. 在 jsp 页面显示进度实验:1) 使用 iframe 发送请求,请求一个Servlet, 在Servlet 中返回响应,发送自增的num此时会发现 iframe 会不停第想Servlet发送请求2) 点击文件上传按钮后,iframe立刻停止刷新,直至上传完毕页面跳转至新页面3)为了观察实验结果,将form 的target 指定为iframe,UploadServlet回送上传完毕的结果4) 出现上述问题的原因,浏览器不支持多线程同时访问服务器只能同时发送一个请求,这样的访问方式为同步访问5) 要在文件上传的同时在iframe中实现进度访问,就需要ie浏览器与服务器进行异步交互此时就需要 XMLHttpRequest 对象在网页特效中可以直接使用XMLHttpRequest 对象与服务器进行异步通信获得XmlHttpRequest 对象的方式有两种ie7以上版本var xhr = null;if(window.XMLHttpRequest)xhr = new XMLHttpRequest();ie7以下版本if(window.ActiveXObject)xhr = new ActiveXObject(“Microsoft.XMLHTTP”);获得对象后需要调用open方法输入请求地址注意请求方式,地址的输入,并且需要设置为true 指定异步访问该地址xhr.open(“get”,”/upload/servlet/UploadServlet”, false)// 调用send 方法发送请求,post方式需要发送消息体,get方式则不用直接传入null值xhr.send(null);// 访问 responseT ext 属性获得 Servlet 回送的数据document.write(xhr.responseText);四、 api方法1. DiskFileItemFactory 对象设置缓冲区大小,字节为单位,默认为10K,一般不用修改factory.setSizeThreshold(1000);设置临时文件存放目录factory.setRepository(file);2. ServletFileUpload 对象判断是否为文件上传表单boolean b = upload.isMultipartContent(request);解析request对象List<FileItem> list = upload.parseRequest(request);设置上传文件的最大值setFileSizeMax(long fileSizeMax)设置上传文件总量的最大值setSizeMax(long sizeMax)设置编码格式setHeaderEncoding(ng.String encoding)注册进度监听器setProgressListener(ProgressListener pListener)3. FileItem 对象获得表单字段的属性名item.getFieldName();获得普通字段的值item.getString(charsetName)获得文件上传字段的文件名item.getName()获得文件上传的流item.getInputStream()文件上传时需要注意的问题:1.如何设置上传文件最大值,并实现超出最大值时给用户一个友好提示upload.setFileSizeMax(1024*10); //设置最大值实现超出最大值时给用户一个友好提示:在程序中捕获FileUploadBase.FileSizeLimitExceededException只要程序抛出这个异常,代表用户上传的文件超出最大值2.上传过程中的乱码问题2.1 普通输入项的乱码item.getString("码表 ")2.2 上传文件名的乱码ServletFileUpload.setHeaderEncoding("码表")3.上传文件的安全性问题为防止用户直接上传文件,危害服务器安全,程序应禁止用户直接访问上传文件(即把上传文件保存在用户无法直接访问的目录)4.防止文件覆盖(UUID)5.文件打散存储(一个目录下面不能存超出1000个文件)用hash算法生成目录保存6.设置监听器,监听文件上传进度upload.setProgressListener(newProgressListener(){public void update(long arg0, longarg1, int arg2) {System.out.println("当前已上传" +arg0 + ",当前处理的文件总大小" + arg1);}});7.临时文件的删除问题处理完每一个文件上传后,一定要记得调用Fileitem.delete方法,删除临时文件8.限定上传文件类型判断上传文件后缀名。
JSP实现多个⽂件上传的两种⽅法JSP 实现多个⽂件上传的两种⽅法JSP实现⽂件上传的实现⽅式是这样的:使⽤ServletRequest类的getInputStream()⽅法获得⼀个客户端向服务器发出的数据流,然后处理这个数据流,从中分析得到⽂件上传中传递到服务器的各个参数和数据,然后将其中的⽂件数据存储为⼀个⽂件或插⼊到数据库中。
通常JSP页⾯中不处理⽂件的上传功能,⽽是把这些功能放到Servlet 或JavaBean中去实现。
使⽤Servlet完成⽂件上传的例⼦在其他JSP书籍中有所介绍,这⾥只介绍使⽤JeanBean是如何完成⽂件上传的。
JSP中实现⽂件的上传可以采⽤两种⽅式即采⽤HTTP协议和FTP协议实现,⼆者在传输的原理上存在很⼤的差异。
以下将结合源代码对它们的实现做简单介绍,相信读者会从中有所收获。
在JSP中使⽤JavaBean实现基于Web的⽂件上传功能⼀般需要三种⽂件结合完成。
这三种⽂件分别是提供界⾯的HTML页⾯⽂件、完成调⽤实现上传功能的JavaBean的JSP⽂件和实现JavaBean的Java的类⽂件。
1.采⽤HTTP协议实现多个⽂件的上传在过去的HTML页⾯中,表单不能实现⽂件的上传,这多少限制了⼀些⽹页的功能。
RFC1867规范(即HTML中实现基于表单的⽂件上传)对表单作出了扩展,增加了⼀个表单元素(input type=file)。
通过使⽤这个元素,浏览器会⾃动⽣成⼀个输⼊框和⼀个按钮,输⼊框可供⽤户填写本地的⽂件名和路径名,按钮可以让浏览器打开⼀个⽂件选择框供⽤户选择⽂件。
具体的表单实现如下:选择了⽂件后直接输⼊本地⽂件的绝对路径,表单的action属性值是*.jsp,这意味着请求(包括上载的⽂件)将发送给*.jsp⽂件。
在这个过程中实际上就实现了HTTP⽅式的⽂件上载。
⽂件从客户端到服务器的上传是由HTTP协议的通⽤⽹关界⾯(CGI)⽀持的。
这种上载⽅式要求浏览器和WEB服务器两⽅⾯都能够⽀持Rfc1867。
java实现文件接收_Java实现文件上传1. 创建一个Servlet类,处理文件上传请求。
```javaimport java.io.File;import java.io.IOException;import java.util.List;import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.annotation.WebServlet;public class FileUploadServlet extends HttpServletprivate static final long serialVersionUID = 1L;protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException// 检查请求是否为multipart/form-data类型if (!ServletFileUpload.isMultipartContent(request))response.getWriter(.println("Error: Form must has enctype=multipart/form-data.");response.setStatus(HttpServletResponse.SC_BAD_REQUEST);return;}// 创建一个DiskFileItemFactory对象,用于设置临时存储文件的目录和大小限制DiskFileItemFactory factory = new DiskFileItemFactory(;factory.setSizeThreshold(1024 * 1024); // 设置内存缓冲区大小为1MBfactory.setRepository(newFile(System.getProperty("java.io.tmpdir"))); // 设置临时文件目录// 创建ServletFileUpload对象,并设置上传文件的最大大小限制ServletFileUpload upload = new ServletFileUpload(factory);upload.setSizeMax(1024 * 1024 * 10); // 设置上传文件的最大大小为10MBtryList<FileItem> items = upload.parseRequest(request); // 解析请求中的所有文件项for (FileItem item : items)if (!item.isFormField() { // 判断当前文件项是否为普通表单字段String fileName = new File(item.getName().getName(; // 获取文件名String filePath = "C:/upload/" + fileName; // 设置文件保存路径item.write(new File(filePath)); // 保存文件到服务器response.getWriter(.println("File uploaded successfully: " + fileName);}}} catch (FileUploadException e)response.getWriter(.println("Error: " + e.getMessage();response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ER ROR);} catch (Exception e)response.getWriter(.println("Error: " + e.getMessage();response.setStatus(HttpServletResponse.SC_BAD_REQUEST);}}```2. 在web.xml中注册Servlet。
前端开发中的文件上传和下载实现方法在现代互联网时代,文件的上传和下载是我们经常要面对的需求。
特别是在前端开发中,如何实现文件上传和下载功能是一个相当重要的课题。
本文将介绍一些前端开发中常用的文件上传和下载的实现方法。
一、文件上传的实现方法1. 表单提交方式最传统的文件上传方法就是利用表单提交。
我们可以通过创建一个包含文件输入框的表单,然后用户选择文件后,点击提交按钮将文件上传到服务器。
在HTML中,可以使用input元素的type属性为file来创建文件输入框,然后将表单的enctype属性设置为multipart/form-data,这样可以保证文件能够正确上传到服务器。
在服务端,可以使用各种后端技术来处理上传文件,如Java的Servlet、PHP、Node.js等。
2. AJAX方式使用AJAX方式实现文件上传可以实现无刷新上传,提升用户体验。
传统的表单提交会导致页面的刷新,而使用AJAX可以在不刷新页面的情况下异步上传文件。
在实现上,可以使用FormData对象来传输文件数据,并通过XMLHttpRequest 对象发送请求。
同时,通过监听上传进度事件,可以实时显示文件上传的进度。
3. 第三方库除了自己实现文件上传逻辑外,也可以使用第三方库来简化文件上传的过程。
一些流行的前端框架和库,如jQuery、React等都提供了丰富的插件或组件来方便实现文件上传功能。
这些插件和组件一般都有了良好的兼容性和一套完整的API,可以大大简化文件上传的开发流程。
二、文件下载的实现方法1. 普通链接下载最简单的文件下载方式就是提供一个普通链接,让用户点击链接后即可下载文件。
在HTML中,可以使用a标签的href属性指向文件的URL,然后点击该链接即可完成文件下载。
不过需要注意的是,在特定情况下,如需要下载大文件时,直接使用普通链接下载可能会导致浏览器崩溃或内存耗尽的问题。
2. Blob对象下载为了解决上述问题,可以使用Blob对象来进行文件下载。
一.在JSP环境中利用Commons-fileupload组件实现文件上传1.页面upload.jsp清单如下:Java代码1.<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>2.3.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML4.01 Transitional//EN">4.<html>5. <head>6. <title>The FileUpload Demo</title>7. </head>8.9. <body>10. <form action="UploadFile" method="post" enctype="multipart/form-data">11. <p><input type="text" name="fileinfo" value="">文件介绍</p>12. <p><input type="file" name="myfile" value="阅读文件"></p>13. <p><input type="submit" value="上传"></p>14. </form>15. </body>16.</html>注意:在上传表单中,既有一般文本域也有文件上传域2.FileUplaodServlet.java清单如下:Java代码1.package org.chris.fileupload;2.3.import java.io.File;4.import java.io.IOException;5.import java.util.Iterator;6.import java.util.List;7.8.import javax.servlet.ServletException;9.import javax.servlet.http.*;10.11.import org.apachemons.fileupload.FileItem;12.import org.apachemons.fileupload.FileItemFactory;13.import org.apachemons.fileupload.disk.DiskFileItemFactory;14.import org.apachemons.fileupload.servlet.ServletFileUpload;15.16.public class FileUplaodServlet extends HttpServlet {17.18. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {19. doPost(request, response);20. }21.22. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {23.24. request.setCharacterEncoding("UTF-8");25.26. //文件的上传部份27. boolean isMultipart = ServletFileUpload.isMultipartContent(request);28.29. if(isMultipart)30. {31. try {32. FileItemFactory factory = new DiskFileItemFactory();33. ServletFileUpload fileload = new ServletFileUpload(factory);34.35.// 设置最大文件尺寸,那个地址是4MB36. fileload.setSizeMax(4194304);37. List<FileItem> files = fileload.parseRequest(request);38. Iterator<FileItem> iterator = files.iterator();39. while(iterator.hasNext())40. {41. FileItem item = iterator.next();42. if(item.isFormField())43. {44. String name = item.getFieldName();45. String value = item.getString();46. System.out.println("表单域名为: " + name + "值为: " + value);47. }else48. {49. //取得取得文件名,此文件名包括途径50. String filename = item.getName();51. if(filename != null)52. {53. File file = new File(filename);54. //若是此文件存在55. if(file.exists()){56. File filetoserver = new File("d:\\upload\\",file.getName());57. item.write(filetoserver);58. System.out.println("文件 " + filetoserver.getName() + " 上传成功!!");59. }60. }61. }62. }63. } catch (Exception e) {64. System.out.println(e.getStackTrace());65. }66. }67. }68.}3.web.xml清单如下:Java代码1.<?xml version="1.0" encoding="UTF-8"?>2.<web-app version="2.4"3. xmlns="java.sun/xml/ns/j2ee"4. xmlns:xsi="/2001/XMLSchema-instance"5. xsi:schemaLocation="java.sun/xml/ns/j2ee6. java.sun/xml/ns/j2ee/web-app_2_4.xsd">7.8. <servlet>9. <servlet-name>UploadFileServlet</servlet-name>10. <servlet-class>11. org.chris.fileupload.FileUplaodServlet12. </servlet-class>13. </servlet>14.15. <servlet-mapping>16. <servlet-name>UploadFileServlet</servlet-name>17. <url-pattern>/UploadFile</url-pattern>18. </servlet-mapping>19.20. <welcome-file-list>21. <welcome-file>/Index.jsp</welcome-file>22. </welcome-file-list>23.24.</web-app>二.在strut1.2中实现1.上传页面file.jsp 清单如下:Java代码1.<%@ page language="java" pageEncoding="ISO-8859-1"%>2.<%@ taglib uri="/struts/tags-bean" prefix="bean"%>3.<%@ taglib uri="/struts/tags-html" prefix="html"%>4.5.<html>6. <head>7. <title>JSP for FileForm form</title>8. </head>9. <body>10. <html:form action="/file" enctype="multipart/form-data">11. <html:file property="file1"></html:file>12. <html:submit/><html:cancel/>13. </html:form>14. </body>15.</html>2.FileAtion.java的清单如下:Java代码1./*2. * Generated by MyEclipse Struts3. * Template path: templates/java/JavaClass.vtl4. */5.package action;6.7.import java.io.*;8.9.import javax.servlet.http.HttpServletRequest;10.import javax.servlet.http.HttpServletResponse;11.import org.apache.struts.action.Action;12.import org.apache.struts.action.ActionForm;13.import org.apache.struts.action.ActionForward;14.import org.apache.struts.action.ActionMapping;15.import org.apache.struts.upload.FormFile;16.17.import form.FileForm;18.19./**20. * @author Chris21. * Creation date: 6-27-202022. *23. * XDoclet definition:24. * @struts.action path="/file" name="fileForm" input="/file.jsp"25. */26.public class FileAction extends Action {27. /*28. * Generated Methods29. */30.31. /**32. * Method execute33. * @param mapping34. * @param form35. * @param request36. * @param response37. * @return ActionForward38. */39. public ActionForward execute(ActionMapping mapping, ActionForm form,40. HttpServletRequest request, HttpServletResponse response) {41. FileForm fileForm = (FileForm) form;42. FormFile file1=fileForm.getFile1();43. if(file1!=null){44. //上传途径45. String dir=request.getSession(true).getServletContext().getRealPath("/upload");46. OutputStream fos=null;47. try {48. fos=new FileOutputStream(dir+"/"+file1.getFileName());49. fos.write(file1.getFileData(),0,file1.getFileSize());50. fos.flush();51. } catch (Exception e) {52. // TODO Auto-generated catch block53. e.printStackTrace();54. }finally{55. try{56. fos.close();57. }catch(Exception e){}58. }59. }60. //页面跳转61. return mapping.findForward("success");62. }63.}3.FileForm.java的清单如下:Java代码1.package form;2.3.import javax.servlet.http.HttpServletRequest;4.import org.apache.struts.action.ActionErrors;5.import org.apache.struts.action.ActionForm;6.import org.apache.struts.action.ActionMapping;7.import org.apache.struts.upload.FormFile;8.9./**10. * @author Chris11. * Creation date: 6-27-202012. *13. * XDoclet definition:14. * @struts.form name="fileForm"15. */16.public class FileForm extends ActionForm {17. /*18. * Generated Methods19. */20. private FormFile file1;21. /**22. * Method validate23. * @param mapping24. * @param request25. * @return ActionErrors26. */27. public ActionErrors validate(ActionMapping mapping,28. HttpServletRequest request) {29. // TODO Auto-generated method stub30. return null;31. }32.33. /**34. * Method reset35. * @param mapping36. * @param request37. */38. public void reset(ActionMapping mapping, HttpServletRequest request) {39. // TODO Auto-generated method stub40. }41.42. public FormFile getFile1() {43. return file1;44. }45.46. public void setFile1(FormFile file1) {47. this.file1 = file1;48. }49.}4.struts-config.xml的清单如下:Java代码1.<?xml version="1.0" encoding="UTF-8"?>2.<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "/d tds/struts-config_1_2.dtd">3.4.<struts-config>5. <data-sources />6. <form-beans >7. <form-bean name="fileForm" type="form.FileForm" />8.9. </form-beans>10.11. <global-exceptions />12. <global-forwards />13. <action-mappings >14. <action15. attribute="fileForm"16. input="/file.jsp"17. name="fileForm"18. path="/file"19. type="action.FileAction"20. validate="false">21. <forward name="success" path="/file.jsp"></forward>22. </action>23.24. </action-mappings>25.26. <message-resources parameter="ApplicationResources" />27.</struts-config>5.web.xml代码清单如下:Java代码1.<?xml version="1.0" encoding="UTF-8"?>2.<web-app xmlns="java.sun/xml/ns/j2ee" xmlns:xsi="w/2001/XMLSchema-instance" version="2.4" xsi:schemaLocatio n="java.sun/xml/ns/j2ee java.sun/xml/ns/j2ee/web-app_2_4.xsd">3. <servlet>4. <servlet-name>action</servlet-name>5. <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>6. <init-param>7. <param-name>config</param-name>8. <param-value>/WEB-INF/struts-config.xml</param-value>9. </init-param>10. <init-param>11. <param-name>debug</param-name>12. <param-value>3</param-value>13. </init-param>14. <init-param>15. <param-name>detail</param-name>16. <param-value>3</param-value>17. </init-param>18. <load-on-startup>0</load-on-startup>19. </servlet>20. <servlet-mapping>21. <servlet-name>action</servlet-name>22. <url-pattern>*.do</url-pattern>23. </servlet-mapping>24.</web-app>三.在struts2中实现(以图片上传为例)1.FileUpload.jsp代码清单如下:Java代码1.<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>2.<%@ taglib prefix="s" uri="/struts-tags" %>3.<html>4. <head>5. <title>The FileUplaodDemo In Struts2</title>6. </head>7.8. <body>9. <s:form action="fileUpload.action" method="POST" enctype="multipart/form-data">10. <s:file name="myFile" label="MyFile" ></s:file>11. <s:textfield name="caption" label="Caption"></s:textfield>12. <s:submit label="提交"></s:submit>13. </s:form>14. </body>15.</html>2.ShowUpload.jsp的功能清单如下:Java代码1.<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>2.<%@ taglib prefix="s" uri="/struts-tags" %>3.<html>4. <head>5. <title>ShowUpload</title>6. </head>7.8. <body>9. <div style ="padding: 3px; border: solid 1px #cccccc; text-align: center" >10. <img src ='UploadImages/<s:property value ="imageFileName"/> '/>11. <br />12. <s:property value ="caption"/>13. </div >14. </body>15.</html>3.FileUploadAction.java的代码清单如下:Java代码1.package com.chris;2.3.import java.io.*;4.import java.util.Date;5.6.import org.apache.struts2.ServletActionContext;7.8.9.import com.opensymphony.xwork2.ActionSupport;10.11.public class FileUploadAction extends ActionSupport{12.13. private static final long serialVersionUID = 572146812454l;14. private static final int BUFFER_SIZE = 16 * 1024 ;15.16. //注意,文件上传时<s:file/>同时与myFile,myFileContentType,myFileFileName绑定17. //因此同时要提供myFileContentType,myFileFileName的set方式18.19. private File myFile; //上传文件20. private String contentType;//上传文件类型21. private String fileName; //上传文件名22. private String imageFileName;23. private String caption;//文件说明,与页面属性绑定24.25. public void setMyFileContentType(String contentType) {26. System.out.println("contentType : " + contentType);27. this .contentType = contentType;28. }29.30. public void setMyFileFileName(String fileName) {31. System.out.println("FileName : " + fileName);32. this .fileName = fileName;33. }34.35. public void setMyFile(File myFile) {36. this .myFile = myFile;37. }38.39. public String getImageFileName() {40. return imageFileName;41. }42.43. public String getCaption() {44. return caption;45. }46.47. public void setCaption(String caption) {48. this .caption = caption;49. }50.51. private static void copy(File src, File dst) {52. try {53. InputStream in = null ;54. OutputStream out = null ;55. try {56. in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE);57. out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE);58. byte [] buffer = new byte [BUFFER_SIZE];59. while (in.read(buffer) > 0 ) {60. out.write(buffer);61. }62. } finally {63. if ( null != in) {64. in.close();65. }66. if ( null != out) {67. out.close();68. }69. }70. } catch (Exception e) {71. e.printStackTrace();72. }73. }74.75. private static String getExtention(String fileName) {76. int pos = stIndexOf(".");77. return fileName.substring(pos);78. }79.80.@Override81. public String execute() {82. imageFileName = new Date().getTime() + getExtention(fileName);83. File imageFile = new File(ServletActionContext.getServletContext().getRealPath("/UploadImages" ) + "/" + imageFileN ame);84. copy(myFile, imageFile);85. return SUCCESS;86. }87.}注:现在仅为方便实现Action因此继承ActionSupport,并Overrider execute()方式在struts2中任何一个POJO都能够作为Action4.struts.xml清单如下:Java代码1.<?xml version="1.0" encoding="UTF-8" ?>2.<!DOCTYPE struts PUBLIC3. "-//Apache Software Foundation//DTD Struts Configuration2.0//EN"4. "/dtds/struts-2.0.dtd">5.<struts>6. <package name="example" namespace="/" extends="struts-default">7. <action name="fileUpload" class="com.chris.FileUploadAction">8. <interceptor-ref name="fileUploadStack"/>9. <result>/ShowUpload.jsp</result>10. </action>11. </package>12.</struts>5.web.xml清单如下:Java代码1.<?xml version="1.0" encoding="UTF-8"?>2.<web-app version="2.4"3. xmlns="java.sun/xml/ns/j2ee"4. xmlns:xsi="/2001/XMLSchema-instance"5. xsi:schemaLocation="java.sun/xml/ns/j2ee6. java.sun/xml/ns/j2ee/web-app_2_4.xsd">7. <filter >8. <filter-name > struts-cleanup </filter-name >9. <filter-class >10. org.apache.struts2.dispatcher.ActionContextCleanUp11. </filter-class >12. </filter >13. <filter-mapping >14. <filter-name > struts-cleanup </filter-name >15. <url-pattern > /* </url-pattern >16. </filter-mapping >17.18. <filter>19. <filter-name>struts2</filter-name>20. <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>21. </filter>22. <filter-mapping>23. <filter-name>struts2</filter-name>24. <url-pattern>/*</url-pattern>25. </filter-mapping>26. <welcome-file-list>27. <welcome-file>Index.jsp</welcome-file>28. </welcome-file-list>29.30.</web-app>。
JSP/servlet文件上传
common-fileupload组件
下载地址:/commons/fileupload/
下载后解压zip包,将commons-fileupload-1.0.jar复制到tomcat的webapps\你的webapp\WEB-INF\lib\下
Create a servlet
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import mons.fileupload.*;
public class Upload extends HttpServlet {
private String uploadPath = "C:\\upload\\"; // 用于存放上传文件的目录 private String tempPath = "C:\\upload\\tmp\\"; // 用于存放临时文件的目录
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
try {
DiskFileUpload fu = new DiskFileUpload();
// 设置最大文件尺寸,这里是4MB
fu.setSizeMax(4194304);
// 设置缓冲区大小,这里是4kb
fu.setSizeThreshold(4096);
// 设置临时目录:
fu.setRepositoryPath(tempPath);
// 得到所有的文件:
List fileItems = fu.parseRequest(request);
Iterator i = fileItems.iterator();
// 依次处理每一个文件:
while(i.hasNext()) {
FileItem fi = (FileItem)i.next();
// 获得文件名,这个文件名包括路径:
String fileName = fi.getName();
if(fileName!=null) {
// 在这里可以记录用户和文件信息
// ...
// 写入文件a.txt,你也可以从fileName中提取文件名:
fi.write(new File(uploadPath + "a.txt"));
}
}
// 跳转到上传成功提示页面
}
catch(Exception e) {
// 可以跳转出错页面
}
}
}
//当servlet收到浏览器发出的Post请求后,在doPost()方法中实现文件上传。
以下是示例代码:
如果要在配置文件中读取指定的上传文件夹,可以在init()方法中执行:
public void init() throws ServletException {
uploadPath = ....
tempPath = ....
// 文件夹不存在就自动创建:
if(!new File(uploadPath).isDirectory())
new File(uploadPath).mkdirs();
if(!new File(tempPath).isDirectory())
new File(tempPath).mkdirs();
}
配置servlet,用记事本打开tomcat\webapps\你的webapp\WEB-INF\web.xml,没有的话新建一个。
典型配置如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>Upload</servlet-name>
<servlet-class>Upload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Upload</servlet-name>
<url-pattern>/fileupload</url-pattern>
</servlet-mapping>
</web-app>
配置好servlet后,启动tomcat,写一个简单的html测试:
<form action="fileupload" method="post" enctype="multipart/form-data" name="form1">
<input type="file" name="file">
<input type="submit" name="Submit" value="upload">
</form>
注意action="fileupload"其中fileupload是配置servlet时指定的url-pattern。