Struts2文件上传

Struts2文件上传

1.表单数据的编码方式
  1. application/x-www-form-urlencoded。这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。
  2. multipart/form-data。采用这种编码方式的表单会以二进制流的方式来处理表单数据,将文件域指定文件的内容也封装到请求参数中。
  3. text/plain。当表单的action属性值为mailto:URL的形式时,这种编码方式比较方便,它主要适用于直接通过表单发送邮件。
    如果想进行文件的上传,那么应将表单的enctype属性设置为multipart/form-data,值得注意的是,一旦表单采用这种形式进行封装,那么将无法直接用HttpServletRequest对象的getParameter()方法取得请求参数值。
2.Struts2中实现文件上传
  1. 新建upload.jsp页面,定义上传表单并进行封装。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page pageEncoding="UTF-8" %>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
<form action="UploadAction!test.action" method="post" enctype="multipart/form-data">
    <label>上传者:</label><input type="text" name="name" /><br>
    <label>请选择图片:</label><input type="file" id="image" name="image" /><hr>
    <input type="submit" value="上传" />
</form>
</body>
</html>
  1. 新建FileUploadUtil类,专门进行上传数据的处理操作
import java.io.*;
import java.util.UUID;

public class FileUploadUtil {
    private File file;//保存上传文件的内容
    private String fileType;//提交过来的file的MIME类型
    private String fileName;//保存生成的文件名称

    /**
     * 构造接收操作文件的内容及上传类型
     * @param file 文件的内容
     * @param fileType 上传类型
     */
    public FileUploadUtil(File file,String fileType){
        this.file = file;
        this.fileType = fileType;
    }

    /**
     * 根据UUID为上传文件命名
     * @return 返回一个不会重复的文件名称
     */
    public String getFileName(){
        if(this.fileName==null||"".equals(this.fileName.trim())){
            String fileExt = null;
            switch(this.fileType){
                case "image/tiff":{
                    fileExt = "tiff";break;
                }
                case "image/png":{
                    fileExt = "png";break;
                }
                case "image/jpeg":{
                    fileExt = "jpeg";break;
                }
                case "image/jpg":{
                    fileExt = "jpg";break;
                }
                default:break;
            }
            this.fileName = UUID.randomUUID()+"."+fileExt;
        }
        return this.fileName;
    }

    /**
     * 文件保存操作
     * @param outFilePath 文件保存路径(包含文件名称)
     * @return 文件保存成功返回true,否则返回false
     * @throws IOException
     */
    public boolean saveFile(String outFilePath) throws IOException {
        File saveFile = new File(outFilePath);
        InputStream input = null;
        OutputStream output = null;
        try{
            if(!saveFile.getParentFile().exists()){//如果目录不存在则创建目录
                saveFile.getParentFile().mkdirs();
            }
            input = new FileInputStream(this.file);//取得字节输入流
            output = new FileOutputStream(saveFile);//取得字节输出流
            byte[] temp = new byte[2048];
            int len = 0;
            while((len=input.read(temp))!=-1){//每次读取2048个字节并保存在数组中
                output.write(temp,0,len);//将数组中的字节进行输出
            }
            return true;
        }catch(IOException e){
            throw e;
        }finally{
            if(input!=null){
                input.close();
            }
            if(output!=null){
                output.close();
            }
        }
    }

    /**
     * 文件删除操作
     * @param filePath 文件路径
     * @return 删除成功返回true,否则返回false
     */
    public boolean deleteFile(String filePath){
        File deleteFile = new File(filePath);
        if(!deleteFile.exists()){
            deleteFile.delete();
            return true;
        }
        return false;
    }
}
  1. 新建UploadAction类,进行上传数据的处理
import com.bank.util.FileUploadUtil;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.*;

import java.io.File;
import java.io.IOException;

@SuppressWarnings("serial")
@ParentPackage(value="root")
@Namespace(value="/pages/upload")
@Action(value="UploadAction")
public class UploadAction extends ActionSupport {
    private String name;
    //file并不是指前端jsp上传过来的文件本身,而是文件上传过来存放在临时文件夹下面的文件
    private File image;
    private String imageFileName;//名称固定(文件上传name+FileName),表示图片原名称
    private String imageContentType;//名称固定(文件上传name+ContentType),表示图片类型

    /*
        setter.getter略
    */
    
    public void test(){
        FileUploadUtil fuu = new FileUploadUtil(this.image,this.imageContentType);
        String newFileName = fuu.getFileName();//为上传文件创建新名字用于保存
        //取得文件保存路径
        String saveFilePath = ServletActionContext.getServletContext().getRealPath("/upload/"+newFileName);
        System.out.println(saveFilePath);
        try {
            fuu.saveFile(saveFilePath);//进行文件保存
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值