Struts2上传文件

     文件上传在我们的生活中非常常见,今天我们就来看看如何利用struts2框架,来实现文件的上传。要实现文件上传的方法实际上已经有很多的例子,但我们在了解了如何实现文件上传功能后,必须去深入了解文件上传的机制。

首先来看一下如何实现文件上传:

一、引入jar包,必须协调commons-fileupload.jar和commons-io.jar的版本

   

二、新建jsp上传界面

     在WebRoot中创建jsp界面(我的是fileUpload.jsp)

<pre name="code" class="html"><body>
    <!-- 表单提交方式一定为post,因为文件上传上传可能会很大,enctype属性,一定要设置为multipart/form-data,不然就会以二进制文本上传到服务器 -->

    <form action="fileUpload2.action" method="post" enctype="multipart/form-data">
    
    username: <input type="text" name="username"><br>
    file: <input type="file" name="file"><br>
    file2: <input type="file" name="file"><br>
    file3: <input type="file" name="file"><br>
    
    <input type="submit" value="submit">
    
    </form>
  </body>
        同时在WebRoot下建立upload文件夹,用于存储上传文件

 
三、创建Action,如(UploadAction) 

package com.shengsiyuan.struts2;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction2 extends ActionSupport
{
	private String username;
	
	private List<File> file; //不是从jsp传过来的文件本身,而是文件上传时临时文件夹下的文件
	
	private List<String> fileFileName;//文件的名字
	
	private List<String> fileContentType;//文件的类型

	public String getUsername()
	{
		return username;
	}

	public void setUsername(String username)
	{
		this.username = username;
	}

	public List<File> getFile()
	{
		return file;
	}

	public void setFile(List<File> file)
	{
		this.file = file;
	}

	public List<String> getFileFileName()
	{
		return fileFileName;
	}

	public void setFileFileName(List<String> fileFileName)
	{
		this.fileFileName = fileFileName;
	}

	public List<String> getFileContentType()
	{
		return fileContentType;
	}

	public void setFileContentType(List<String> fileContentType)
	{
		this.fileContentType = fileContentType;
	}
	
	@Override
	public String execute() throws Exception
	{
		for(int i = 0; i < file.size(); i++)
		{
			InputStream is = new FileInputStream(file.get(i));
			
			String root = ServletActionContext.getRequest().getRealPath("/upload");
			
			File destFile = new File(root, fileFileName.get(i));
			
			OutputStream os = new FileOutputStream(destFile);
			
			byte[] buffer = new byte[400];
			
			int length = 0;
			
			while(-1 != (length = is.read(buffer)))
			{
				os.write(buffer, 0, length);
			}
			
			
			is.close();
			os.close();
		}
		
		return SUCCESS;
	}
	
}

四、struts.xml文件配置

<package name="struts2" extends="struts-default">
	<!-- 最大上传量限制 -->	
	<!-- <constant name="struts.multipart.maxSize" value="104857600000"></constant> -->

        <action name="fileUpload" class="com.shengsiyuan.struts2.UploadAction">
	     <result name="success">/fileUploadResult.jsp</result>			
        </action>
</package>
五、配置struts.properties,该项设置也可以直接配置在struts.xml中,这是同等效果。

struts.action.extension=action
struts.multipart.saveDir=D:/sisi
struts.multipart.maxSize=104857600000

    经过一番配置,终于将可以将文件实现,我们来看一下成果:

    上传界面:

          

          上传成功后:

          

 上传原理:

     struts2框架实现文件上传,实际上是分为两个步骤:

     1)先将客户端上传的文件保存到struts.multipart.saveDir所指定的目录中(我用的目录是D:/sisi),如果该键对应的目录不存在,就会保存到javax.servlet.context.tempdir环境变量所指定的目录中

     2)Action中定义的File类型的成员变量实际指向临时目录中的临时文件,然后服务器通过IO方式将临时文件写入到指定的服务器目录中,我用的服务器是Tomcat,写到了Tomcat的目录中。

总结:

    上述是原理,理解之后更容易实现功能,但我在做上传文件时遇到一个小问题,当上传的文件时空的时候,由于写入时为null值,故不能写入临时文件,查看发现struts不支持上传空文件,暂时是在文件中输入内容,从网上搜索的方案是可以在读入是判断是否为空文件,如果为空,自动在文件中输入空格,以实现功能,现在正在尝试中。。。

            

     

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值