前端之家收集整理的这篇文章主要介绍了
ajax上传文件到本地,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
- <span style="font-family:Microsoft YaHei;font-size:18px;background-color: rgb(204,204,204);">
-
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.util.List;
-
- 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;
-
- /**
- * Servlet implementation class CoreServlet
- */
- @WebServlet(asyncSupported = true,urlPatterns = { "/CoreServlet" })
- public class CoreServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
-
- /**
- * @see HttpServlet#HttpServlet()
- */
- public CoreServlet() {
- super();
- // TODO Auto-generated constructor stub
- }
-
- /**
- * @see HttpServlet#doGet(HttpServletRequest request,HttpServletResponse response)
- */
- protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
- // TODO Auto-generated method stub
- doPost(request,response);
- }
-
- /**
- * @see HttpServlet#doPost(HttpServletRequest request,HttpServletResponse response)
- */
- protected void doPost(HttpServletRequest request,IOException {
- request.setCharacterEncoding("utf-8");
- response.setContentType("text/html; charset=utf-8");
- //获得磁盘文件条目工厂
- DiskFileItemFactory factory = new DiskFileItemFactory();
- //获取文件需要上传到的路径
- String path = this.getServletContext().getRealPath("/temp");
-
-
- //如果没以下两行设置的话,上传大的 文件 会占用 很多内存,
- //设置暂时存放的 存储室,这个存储室,可以和 最终存储文件 的目录不同
- /**
- * 原理 它是先存到 暂时存储室,然后在真正写到 对应目录的硬盘上,
- * 按理来说 当上传一个文件时,其实是上传了两份,第一个是以 .tem 格式的
- * 然后再将其真正写到 对应目录的硬盘上
- */
- factory.setRepository(new File(path));
- //设置 缓存的大小,当上传文件的容量超过该缓存时,直接放到 暂时存储室
- factory.setSizeThreshold(1024*1024) ;
-
- //高水平的API文件上传处理
- ServletFileUpload upload = new ServletFileUpload(factory);
-
-
- try {
- //可以上传多个文件
- List<FileItem> list = (List<FileItem>)upload.parseRequest(request);
-
- for(FileItem item : list)
- {
- //获取表单的属性名字
- String name = item.getFieldName();
-
- //如果获取的 表单信息是普通的 文本 信息
- if(item.isFormField())
- {
- //获取用户具体输入的字符串 ,名字起得挺好,因为表单提交过来的是 字符串类型的
- String value = item.getString() ;
-
- request.setAttribute(name,value);
- }
- //对传入的非 简单的字符串进行处理 ,比如说二进制的 图片,电影这些
- else
- {
- /**
- * 以下三步,主要获取 上传文件的名字
- */
- //获取路径名
- String value = item.getName() ;
- //索引到最后一个反斜杠
- int start = value.lastIndexOf("\\");
- //截取 上传文件的 字符串名字,加1是 去掉反斜杠,
- String filename = value.substring(start+1);
-
- request.setAttribute(name,filename);
-
- //真正写到磁盘上
- //它抛出的异常 用exception 捕捉
-
- //item.write( new File(path,filename) );//第三方提供的
-
- //手动写的
- OutputStream out = new FileOutputStream(new File(path,filename));
-
- InputStream in = item.getInputStream() ;
-
- int length = 0 ;
- byte [] buf = new byte[1024] ;
-
- System.out.println("获取上传文件的总共的容量:"+item.getSize());
-
- // in.read(buf) 每次读到的数据存放在 buf 数组中
- while( (length = in.read(buf) ) != -1)
- {
- //在 buf 数组中 取出数据 写到 (输出流)磁盘上
- out.write(buf,length);
-
- }
- in.close();
- out.close();
- response.getWriter().write("{'success':true}");
- }
- }
-
- } catch (FileUploadException e) {
- // TODO Auto-generated catch block
- response.getWriter().write("捕捉到异常:" + e.getMessage());
- e.printStackTrace();
- }
- catch (Exception e) {
- // TODO Auto-generated catch block
- response.getWriter().write("捕捉到异常:" + e.getMessage());
- e.printStackTrace();
- //e.printStackTrace();
- }
-
- }
-
- }
- </span>
- <span style="font-family:Microsoft YaHei;font-size:18px;background-color: rgb(204,204);">以上部分为后台代码,需要两个jar包,commons-fileupload,commons-io</span>
- <span style="font-family:Microsoft YaHei;font-size:18px;background-color: rgb(204,204);">-----------------------------------------------------------------这个不是分割线-------------------------------------------------------------------</span>
- <span style="font-family:Microsoft YaHei;font-size:18px;background-color: rgb(204,204);">以下是前端页面代码</span>
- <span style="font-family:Microsoft YaHei;font-size:18px;background-color: rgb(204,204);">
- </span>
- <pre name="code" class="html"><span style="font-family:Microsoft YaHei;font-size:18px;background-color: rgb(204,204);"><!DOCTYPE html>
- <html>
- <head>
- <Meta charset="UTF-8">
- <title>上传文件</title>
- <script type="text/javascript">
- function uploadFile() {
- var xmlhttp;
- if (window.XMLHttpRequest) {// code for IE7+,Firefox,Chrome,Opera,Safari
- xmlhttp = new XMLHttpRequest();
- } else {// code for IE6,IE5
- xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
- }
-
- xmlhttp.onreadystatechange=function()
- {
- if (xmlhttp.readyState==4 && xmlhttp.status==200)
- {
- document.getElementById('myDiv').innerHTML=xmlhttp.responseText;
- }
- }
- var formdata = new FormData(document.getElementById('form1'));
- xmlhttp.open("POST","./CoreServlet",true);
- xmlhttp.send(formdata);
- }
- </script>
- </head>
- <body>
-
- <form id="form1" enctype="multipart/form-data">
- 选择要上传的文件:<input type="file" name="file" /><br>
- <button type="button" onclick="uploadFile()">发送</button>
- </form>
- <br>
-
- <div id="myDiv"><h2></h2></div>
- </body>
- </html></span>
-
- <span style="font-family:Microsoft YaHei;font-size:18px;background-color: rgb(204,204);">
- </span>
- <span style="font-family:Microsoft YaHei;font-size:18px;background-color: rgb(204,204);">
- </span>