Struts2中的文件上传下载

文件的上传下载
1文件上传下载基本原理:
在一个 Web 工程中,要实现文件的上传,首先要把表单上传数据的编码方式设置为二进制数据格式,这要用到表单的 enctype 属性,此属性一般有三个值。
1.1    application/x-www-form-urlencoded :这是默认值,适用范围最广泛。但在向服务器发送大量的文本、包含非 ASCII 字符的文本或二进制数据时,这种编码方式效率很低。
1.2    multipart/form-data :上传二进制数据,只有使用了 multipart/form-data 才能完整上传数据,完成上传功能。
1.3    text/plain :主要用于电子邮件的应用。
一般实际应用中多设置 enctype 属性值为 multipart/form-data ,这样在服务器中得到的上传数据才能以二进制传递。然后设置一个输入流,得到页面上传来的文件信息,再用一个输出流将这个文件写入服务器的内存中。部分代码改自三扬科技,开发者突击: Struts2 核心技术与 JavaEE 框架整合开发实战一书。
2.应用详解:
FileAction.java 实现功能的代码段:
// 用列表封装上传文件的三个属性 , 若只上传一个文件的情况,可以不用列表。
    private List<File> upload ;
 
    private List<String> uploadContentType ;
 
    private List<String> uploadFileName ;
 
// savePath,fileName 为数据库中的对应项
private String savePath ;
private String fileName ;
private File file ;
public String addSave() throws Exception {
System. out .println( "-------fileaddsave" );
 
// 将页面上传的文件封装成一个列表
       List<File> files = getUpload();
       // 设置上传文件存放的相对路径
       setSavePath( "" );
       String path = "D:/project/file/" ;
       // 保存上传文件路径
 
       File f = new File(path);
 
       // 判断文件夹是否存在,不存在,则创建一个新文件夹
       try {
           if (!f.isDirectory()) {
              f.mkdir();
           }
           // 遍历删除所有该文件夹下的文件
           File[] flist = f.listFiles();
           for ( int i = 0; i < flist. length ; i++) {
              flist[i].delete();
           }
       } catch (Exception ex) {
           ex.printStackTrace();
       }
 
       // 用一个 for 循环把 files 中的所有文件取出来逐一上传
 
       if (files != null ) {
           for ( int i = 0; i < files.size(); i++) {
              // 以上传文件存放路径和原文件名建立一个输出流 path+ System.currentTimeMillis()+
              // fileName.substring(fileName.lastIndexOf("."),fileName.length())
              String filename = getUploadFileName().get(i);
              System. out .println(filename);
              FileOutputStream fos;
              getRequest().getSession().setAttribute( "fileName" , filename);
              // if explore is ie
              if (filename.indexOf( "/" ) == -1) {
                  fos = new FileOutputStream(path + filename);
 
              } else { // if explore is firefox
                  String fileNAME = filename.substring(filename
                         .lastIndexOf( "/" ), filename.length());
                  fos = new FileOutputStream(path + fileNAME);
 
              }
              System. out .println(getUploadFileName().get(i));
              // 以上传文件建立一个输入流
              FileInputStream fis = new FileInputStream((File) files.get(i));
              // 将上传文件写入到输出流所对应的文件中
              byte [] buffer = new byte [1024];
              int len = 0;
              while ((len = fis.read(buffer)) > 0) {
                  fos.write(buffer, 0, len);
              }
              fos.close();
           }
 
       }
       String fileName = (String) getRequest().getSession().getAttribute(
              "fileName" );
       file .setSavePath(path);
       file .setFileName(fileName);
       fileDAO .attachDirty( file );
return SUCCESS ;
    }
 
 
    public String download() throws Exception {
 
       Integer id = (Integer) getRequest().getSession().getAttribute( "id" );
       file = (File) fileDAO .findByProperty( "id" , id)
              .get(0);
       String path = file .getSavePath();
       String name = file .getFileName();
       File f = new File(path);
       if (f.exists()) {
           try {
              getResponse().setContentType( "application/octec-stream" );
              getResponse().setHeader(
                     "Content-Disposition" ,
                     "attachment;filename="
                            + new String(name.getBytes(), "ISO-8859-1" ));
              OutputStream outputStream = getResponse().getOutputStream();
              InputStream inputStream = new FileInputStream(path);
              byte [] buffer = new byte [1024];
              int i = -1;
              while ((i = inputStream.read(buffer)) != -1) {
                  outputStream.write(buffer, 0, i);
              }
              outputStream.flush();
              outputStream.close();
              inputStream.close();
              outputStream = null ;
           } catch (Exception e) {
              e.printStackTrace();
           }
       }
       return null ;
    }

你可能感兴趣的:(struts2,职场,下载,上传,休闲)