struts文件上传

在网站开发中,文件上传和下载是经常用到的,我们给大家讲解一个文件上传和下载的案例。

比如我们在注册一个用户的时候,往往需要上传一个用户的头像。

Struts文件上传原理示意图:

register.jsp

<h5>注册用户</h5>

  <!-- 如果我们的表单有文件控件,则需要重新指定 表单的编码方式-->

  <form action="/strutsFileupAndDown/register.do" method="post" enctype="multipart/form-data"/>

  用户名:<input type="text" name="username"></br>

  密码:<input type="password" name="password"></br>

  头像:<input type="file" name="myphoto"/></br>

  <input type="submit" value="注册"/>

  </form>


 

ActionForm.java

public class UserForm extends ActionForm {

 private String username;

 private String password;

 private FormFile myphoto;

 Set/get(方法);

}

ok.jsp

 <h5>注册成功</h5>

   <a href="#">点击查看用户列表</a>

RegisterAction.java

public class RegisterAction extends Action {

    public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {

         UserForm userForm = (UserForm) form;

        <span style="background-color: rgb(204, 204, 204);"><span style="color:#009900;"> //取出用户名和密码</span></span>

       String name=userForm.getUsername();
  
       String pass=userForm.getPassword();
 
      //取出文件
      FormFile formFile=userForm.getMyphoto();

      //通过formFile我们可以获取关于用户上传文件的各种信息
      String filename=formFile.getFileName();

      int filesize=formFile.getFileSize();

     //取出输入流
     InputStream is=null;

     OutputStream os=null;

     try {

        is=formFile.getInputStream();

        //得到一个输出流-->文件

        //1.得到file文件夹上传到tomcat服务器后的绝对路径
       String keepFilePath=this.getServlet().getServletContext().getRealPath("/images");

       os=new FileOutputStream(keepFilePath+"\\"+MyTools.newFilename(filename));
       //读取文件并写出到服务器images
      int len=0;

      //做一个缓存buffer
     byte[]bytes=new byte[1024];

    //循环处理
      while((len=is.read(bytes))>0){

     //读一点,写出一点
    os.write(bytes, 0, len);

    }

  } catch (Exception e) {

      e.printStackTrace();

    }finally{

   try {

     is.close();

     os.close();

      } catch (IOException e) {

        e.printStackTrace();

     }

  }

   return null;

 }

}

解决文件上传的细节问题:

1.覆盖文件的问题?

我们为了防止第二次上传的文件名相同为覆盖了

思路:

先看看有没有该文件,然后如果有了,则给以后上传的文件取一个名字,

为了防止新取文件名称重复(年+++++毫秒)还有一种方法uuid

解决方法:

思路:编写一个工具类,可以生成一个不重复的文件名,然后再保存

public class MyTools {
	public static String getNewFileName(String fileName){
		String uuid=UUID.randomUUID().toString();
		int beginIndex=fileName.lastIndexOf(".");
		String newFilename=uuid+fileName.substring(beginIndex, fileName.length());
		return newFilename;
	}
}

然后在Action中调用这个方法

<span style="color:#009900;">//1.得到file文件夹上传到tomcat服务器后的绝对路径</span>
    String keepFilePath=this.getServlet().getServletContext().getRealPath("/images");
    
    os=new FileOutputStream(keepFilePath+"\\"+MyTools.getNewFileName(filename));

2.如果是中文名怎么办?

2.1首先使用过滤器

新建一个过滤器,过滤器建完后还要在web.xml中手动配置,把之前配置的全删掉,不然过滤器默认只是普通的Servlet而已,所以我们要重新配置

public class MyFilter1 extends HttpServlet implements Filter {

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
			arg0.setCharacterEncoding("utf-8");
			arg2.doFilter(arg0, arg1);	
	}
	public void init(FilterConfig arg0) throws ServletException {	
	}
}
web.xml中配置过滤器
<!-- 配置我们的过滤器 -->
<filter>
	<filter-name>MyFilter1</filter-name>
	<filter-class>com.hl.filter.MyFilter1</filter-class>
</filter>
<filter-mapping>
	<filter-name>MyFilter1</filter-name>
	<url-pattern>/*</url-pattern>
<pre name="code" class="html"></filter-mapping>

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资源 5来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资 5源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未名胡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值