JSP文件上传
不多说了,言归正传,让我们开始认识JSP上传。
首先,要弄清楚本地上传和服务器上传的区别,虽然基本上本地上传不会用到,但是我还是想把它列出来,好让童鞋们看清楚二者之间的分别。
本地上传
JSP中
<form method="post" action="fileupload.do">
<input type="file" name="file" id="file" value="path"/>
</form>
action中
private static final int BUFFER_SIZE = 300 * 1024;
private String path;
public String setPath(String path){this.path = path;}
private static void copy(File src, File dst) {
if(!dst.exists()) {
try {
dst.createNewFile();
} catch (IOException e1) {
e1.printStackTrace();
}
} else {
return;
}
try {
InputStream in = null ;
OutputStream out = null ;
try {
in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE);
out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE);
byte [] buffer = new byte [BUFFER_SIZE];
while (in.read(buffer) > 0 ) {
out.write(buffer);
}
} finally {
if ( null != in) {
}
if ( null != out) {
out.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public String upload(){
File loadFile = new File(path);
File saveFile = new File("你想存的路径");
copy(loadFile, saveFile);
}
这就完成了“本地上传”,本地上传的含义就是,你的服务器必须在本地,也就是和你上传时操作的是同一台电脑,这样才能上传成功。
话说本地上传有什么用?天知道,至少我觉得除非是在自己电脑上随便玩玩,不然是完全没有意义的。。。。。。
好了,现在开始服务器上传
利用struts2进行服务器上传的示例太多了,比如说这篇文章
http://blog.csdn.net/neusoftware_20063500/archive/2009/05/03/4144930.aspx
这种俗称通过"多媒体"的上传方式是很方便快捷的,但它隐藏了太多细节,比如说myFile是怎么被set进去的?这就是“封装”的得与失。
struts2提供的几个包里面,也有用来实现文件上传的包,通过这些包里面的一些方法,我们能略为知晓一些过程。
这种方法也有一个坏处,就是在Action中是无法使用的,只能通过jsp或者servlet来使用,为什么?看代码就知道了:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
if (!DiskFileUpload.isMultipartContent(request)) { //如果非含文件域的表单提交则return
return;
}
/*设置当文件大于102400字节的时候文件的临时目录*/
DefaultFileItemFactory factory = new DefaultFileItemFactory();
factory.setSizeThreshold(102400);
File fileTemp = new File("D:/file/");
fileTemp.mkdirs();
factory.setRepository(fileTemp);
DiskFileUpload upload = new DiskFileUpload(factory);
upload.setSizeMax(1024000);
List<FileItem> items = null;
try {
items = upload.parseRequest(request); //将request解析成FileItem对象的集合
} catch (SizeLimitExceededException e) {
request.setAttribute("message", "<script>alert('上传失败:您上传的文件太大!请重新选择')</script>");
System.out.print("上传文件太大");
return;
}
for (FileItem item : items) { //遍历集合
if (item.isFormField()) { //如果普通的域
String name = item.getFieldName();
String value = item.getString("GB18030");
System.out.println("name : " + name + "\tvalue : " + value);
} else {
String filename = item.getName();
System.out.println("filename : " + filename);
int i = filename.lastIndexOf("\\");
filename = filename.substring(i + 1);
System.out.println("filename : " + filename);
File f = new File("D:/file/" + filename);
item.write(f);
System.out.print("上传成功");
}
}
} catch (Exception e) {
e.printStackTrace();
}
request.getRequestDispatcher(request.getParameter("/manager/back/zizhi.jsp")).forward(request, response);
}
方法中的代码完全可以拷贝到jsp中去执行,效果是相同的。
为什么说只能在servlet和jsp中运行呢?在Action中运行会怎么样?请大家在csdn搜索 parseRequest 然后看答案
是的,N多的帖子都在问 为什么items是空的?为什么……
答案如果有详细看过回答的人会知道,因为struts2的拦截器把HttpServletRequest request拦截了,然后对它进行了一系列的处理,之后返回了一个“新”的request给我们,好吧,这个request里面压根儿就没有那些个劳什子FileItem对象
具体可以看官网的介绍
http://commons.apache.org/fileupload/faq.html
懒的人就看下面吧
Why is parseRequest() returning no items?
This most commonly happens when the request has already been parsed, or processed in some other way. Since the input stream has aleady been consumed by that earlier process, it is no longer available for parsing by Commons FileUpload.
那么要怎么解决?
很简单,其实它适应不了你,你就适应它就好了。
如果一定要在Action中写文件上传,那么就用struts2帮你封装好的一系列的东西吧,如果不是一定要在Action中写文件上传,那么用Servlet会比较好控制和使用,而且也容易实现批量上传。
看到这里,好吧,我承认我的目的是为了说明parseRequest的问题。只是留一个记录方便自己以后查询而已。
有什么问题可以发邮件到2177534@qq.com 注明是csdn上看到的。
相关推荐
JSP 实现文件上传功能
本代码主要应用的是jsp技术,而实现的文件上传功能,这个功能也是比较常见的,也是比较常用的,更是在网络中比较流行的。 技术为创建显示动态生成内容的Web页面提供了一个简捷而快速的方法。JSP技术的设计目的是使得构造基于Web的应用程序更加容易和快捷,而这些应用程序能够与各种Web服务器,应用服务器,浏览器和开发工具共同工作。 Web应用开发的JavaServer Pages技术方法 在开发JSP规范的过程中,太阳微系统公司(Sun Microsystems Inc.)与许许多多主要的Web服务器、应用服务器和开发工具供应商,以及各种各样富有经验的开发团体进行合作。其结果是找到了一种为应用和页面开发人员平衡了可移植性和易用性的开发方法。 JSP技术在多个方面加速了动态Web页面的开发: 将内容的生成和显示进行分离 使用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面。使用JSP标识或者小脚本来生成页面上的动态内容(内容是根据请求来变化的,例如请求帐户信息或者特定的一瓶酒的价格)。生成内容的逻辑被封装在标识和JavaBeans组件中,并且捆绑在小脚本中,所有的脚本在服务器端运行。如果核心逻辑被封装在标识和Beans中,那么其他人,如Web管理人员和页面设计者,能够编辑和使用JSP页面,而不影响内容的生成。 在服务器端,JSP引擎解释JSP标识和小脚本,生成所请求的内容(例如,通过访问JavaBeans组件,使用JDBCTM技术访问数据库,或者包含文件),并且将结果以HTML(或者XML)页面的形式发送回浏览器。这有助于作者保护自己的代码,而又保证任何基于HTML的Web浏览器的完全可用性。 强调可重用的组件 绝大多数JSP页面依赖于可重用的,跨平台的组件(JavaBeans或者Enterprise JavaBeansTM组件)来执行应用程序所要求的更为复杂的处理。开发人员能够共享和交换执行普通操作的组件,或者使得这些组件为更多的使用者或者客户团体所使用。基于组件的方法加速了总体开发过程,并且使得各种组织在他们现有的技能和优化结果的开发努力中得到平衡。 采用标识简化页面开发 Web页面开发人员不会都是熟悉脚本语言的编程人员。JavaServer Page技术封装了许多功能,这些功能是在易用的、与JSP相关的XML标识中进行动态内容生成所需要的。标准的JSP标识能够访问和实例化JavaBeans组件,设置或者检索组件属性,下载Applet,以及执行用其他方法更难于编码和耗时的功能。 通过开发定制化标识库,JSP技术是可以扩展的。今后,第三方开发人员和其他人员可以为常用功能创建自己的标识库。这使得Web页面开发人员能够使用熟悉的工具和如同标识一样的执行特定功能的构件来工作。
文件上传,jsp限定后缀名的文件上传功能
文件,图片上传,限定后缀名的文件上传功能
简单的jsp文件上传
简单的jsp文件上传值得初学者借鉴哦呵呵~~~~~
jsp页面实现文件上传下载
利用jsp实现文件的上传和下载,真的很不错,不信你可以看一下
jsp文件上传及下载
最近有人问我关于文件上传下载的问题,我就写了一个简单的文件上传下载代码。


Web 开发
