现在文件上传都是通过Ajax实现。但是利用iframe也可以实现非常类似于Ajax文件上传的效果。
首先,上传文件的组件我使用的是apache的commons-fileupload和commons-io包
先给出利用commons-fileupload组件完成文件上传的后台代码
package com.gxa.edu.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.File;
import java.io.InputStream;
import java.io.FileOutputStream;
import java.util.List;
import java.util.Iterator;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
/**
* 文件上传的Servlet,我们使用Apache组织提供的commons-fileupload.jar和commons-io.jar包实现文件上传功能
* @author Administrator
*
*/
public class FileUploadServlet_2 extends HttpServlet {
/**
* Constructor of the object.
*/
public FileUploadServlet_2() {
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
request.setCharacterEncoding("gb2312");
response.setCharacterEncoding("gb2312");
PrintWriter out = response.getWriter();
final long maxSize = 1024 * 1024 * 5; //定义文件允许上传的大小
final String[] fileExtType = {"jpg" , "JPG" , "gif", "doc" , "docx"}; //定义允许上传文件后缀名
DiskFileItemFactory disk = new DiskFileItemFactory(); //设置实例化一个硬盘工厂
disk.setSizeThreshold(5120); //设置上传文件时临时存放文件到内存缓存区的大小为5kb
String tmpFile = this.getServletContext().getRealPath("/");
System.out.println("临时上传文件路径:" + tmpFile);
File file = new File(tmpFile + "\\" + "tmpFile"); //在javaweb下面建立一个tmpFile文件,该文件用于存放上传时候的临时文件夹
if (!file.exists()) {
file.mkdirs();
}
disk.setRepository(file); //设置缓存的路径或目录
ServletFileUpload sfu = new ServletFileUpload(disk); //初始化上传文件的核心类ServletFileUpload
sfu.setSizeMax(maxSize); //设置文件允许上传的大小
List list = null; //List列表用于存储上传文件表单域中的所有上传值
try {
list = sfu.parseRequest(request); //解析请求过来的上传文件表单域,通过将域中的所有值放到List中
} catch (FileUploadException e) {
e.printStackTrace();
if (e instanceof SizeLimitExceededException) {
out.println("上传文件超过5M");
out.println("<script language='javascript'>");
out.println("window.parent.document.getElementById('msg').innerHTML='<font color=red>上传文件超过5M</font>';");
out.println("window.parent.document.getElementById('file').outerHTML=window.parent.document.getElementById('file').outerHTML;");
out.println("</script>");
return;
}
}
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
FileItem fileItem = (FileItem) iterator.next();
if (fileItem.isFormField()) { //判断是否是一个普遍的表单域,true则表示是普遍表单域而不是文件域
String fieldName = fileItem.getFieldName();
String value = fileItem.getString("gb2312");
} else {
String fileFieldName = fileItem.getFieldName(); //获取文件域的名称
System.out.println("文件域的名称:" + fileFieldName);
String fileName = fileItem.getName(); //上传文件的名称,包括全路径
System.out.println("上传文件的名称:" + fileName);
long fileSize = fileItem.getSize(); //上传文件的大小
System.out.println("上传文件的大小:" + fileSize);
file = new File(tmpFile + "\\" + "fileUploadDir");
if (!file.exists()) {
file.mkdirs();
}
String fileUploadName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
FileOutputStream fos = new FileOutputStream(tmpFile + "\\" + "fileUploadDir" + "\\" + fileUploadName);
if (fileItem.isInMemory()) { //判断上传的文件是否已经在内存中
try {
fos.write(fileItem.get());
out.println("上传文件" + fileUploadName + "成功");
} catch (IOException e) {
out.println("上传文件失败");
return;
} finally {
fos.close();
}
} else {
InputStream is = fileItem.getInputStream(); //获取上传文件内容的输入流
int i = 0;
byte[] b = new byte[1024 * 4];
try {
while ((i = is.read(b)) != -1) {
fos.write(b, 0, i);
}
out.println("上传文件:" + fileUploadName + "成功");
out.println("<script language='javascript'>");
out.println("window.parent.document.getElementById('msg').innerHTML='<font color=red>上传文件成功</font>';");
out.println("window.parent.document.getElementById('file').outerHTML=window.parent.document.getElementById('file').outerHTML;");
out.println("</script>");
} catch (IOException e) {
out.println("上传文件失败");
out.println("<script language='javascript'>");
out.println("window.parent.document.getElementById('msg').innerHTML='<font color=red>上传文件失败</font>';");
out.println("window.parent.document.getElementById('file').outerHTML=window.parent.document.getElementById('file').outerHTML;");
out.println("</script>");
} finally {
is.close();
fos.close();
}
}
}
}
out.flush();
out.close();
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occure
*/
public void init() throws ServletException {
// Put your code here
}
}
下面的JSP页面代码
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>文件上传-3</title>
</head>
<body>
<form name="form1" enctype="multipart/form-data" method="post" action="servlet/FileUploadServlet_2" target="hidden_iframe">
<input type="file" name="file" id="file">
<input type="submit" value="文件上传"><span id="msg"></span>
<iframe name="hidden_iframe" id="hidden_iframe" style="display:none "></iframe>
</form>
</body>
</html>
分享到:
相关推荐
上传原理很简单就是利用表单的打开方式为iframe的id名,这样就可以在当前页面的iframe打来了,实现文件上传,再利用js返回上传结果。
大家应该可以举出几种常用的异步文件上传功能的实现方式,使用频率较多的有原生ajax和iframe框架,实现图片文件上传,下面就为大家分享图片文件上传的两种方式:原生ajax和iframe框架,供大家参考,具体内容如下 ...
很方便的解决了项目中需要用到的文件上传功能。HTML5支持多图片上传,而且支持ajax上传,而且支持上传之前图片的预览,而且支持图片拖拽上传,而且还是纯粹利用file控件实现,JS代码寥寥,想不让人称赞都难啊! ...
简单的文件上传实例,利用iframe实现页面无刷新上传
如此做可以达到比较好的浏览器兼容性,不过代码量会比较大,即使是使用了文件上传插件,例如plupload。 如何能达到灵活的程度呢,能像普通的AJAX提交表单数据那样将文件看成是普通表单参数来对待就好了。 灵光一闪,...
可采用IFRAME文件上传原理。实际上在用PHP上传文件时。。。只能用$_FILES形式,但是若我们只是单一的用JS方式取其ID,如<input id=’img’ type=’file’>..document.getElementById(‘img’).value或者jquery...
后来看到网上的一些解决方案,有现成的ajax上传文件的封装的方法也有利用flash的。flash确实是个好方法 但是不是每个人都会flash的而且下载下来现成的方法要做修改也不是件易事,且文件相对较大。最后只好模拟iframe...
开发文件上传功能从来不是一件愉快的事,异步上传更是如此,使用过iframe和Flash的上传方案,也都感觉十分的别扭。本文简要简绍利用Html5的FormData实现文件的异步上传,还可以实现上传进度条和文件大小验证等。...
Nginx上传进度模块。整理成文档了。一般情况下都是采用Ajax异步方式,创建一个iframe,在iframe里面把数据以form方式提交给后端的服务器脚本,由服务器脚本...上传迚度可以利用Nginx一个uploadprogress模块来获取。
之前朋友说的不刷新上传文件。最暴力的解决方案就是上网上搜各种JS库,附带多图上传,预览,甚至是图片处理等特技。那么如果不接触第三方的库,可不可以利用ajax来做。就这个问题,有人给出的解决方案是借助iframe,...
最近参照网上的一些资料,初步到达了预期目标(客户端获取上传进度,还没发现什么好的方法,没有实现),利用iframe实现了附件的无刷新上传效果(其实有提交iframe),为了使用方便,最后做成了,.net用户自定义控制...
做软工作业时,需要实现无刷新异步上传图片到服务器,于是想利用Ajax: 得到file的val,再post过去… 等真正实现的时候才发现,根本行不通。 于是翻来翻去找到一个封装好的js插件,可以实现异步上传文件。 ...
要通过ajax保存表单,一切都OK,测试也通过,却发现文件没有上传成功!然后就有了用 ajax是否可以上传文件的疑问。
如此做可以达到比较好的浏览器兼容性,不过代码量会比较大,即使是使用了文件上传插件,例如plupload。 如何能达到灵活的程度呢,能像普通的AJAX提交表单数据那样将文件看成是普通表单参数来对待就好了。 灵光一闪,...
目前使用的折中的解决方法是利用一个隐藏起来不显示的iframe。这个隐藏起来的iframe是真正用于上传文件的。用另一个文件域让用户选择文件,当用户选择了上传的文件之后,用JS取得用户的文件的路径然后赋值给那个...
利用iframe对form表单(含文件上传)进行跨任何域提交,无刷新且可以返回值
利用iframe实现 利用ajax实现 豆瓣爬虫(crawler-douban) 利用nodejs实现一个豆瓣的爬虫,使用到的工具包: 遇到的问题: 1) 某些网页不让爬取 解决方法:设置合理的User-Agent,模仿浏览器行为 2)有的用户没有id...
此为本人自制的一款用于查杀<iframe>的软件,在vs 2003环境中利用c#语言开发的一款软件。可以双击readweb.exe直接运行。 用人格担保无病毒,但是还是建议使用前先进行查毒,防止因为其它原因感染病毒。 软件...