struts2上传下载文件中遇到的乱码问题

struts2上传下载文件所需jar包
这里写图片描述

上传下载类
FileUploadAction.java

package action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport {

    /**
     * Struts2针对表单中名为xxx的文件域,在对应的Action类中使用3个属性来封装该文件域信息:
        1.类型为File的xxx属性:用来封装页面文件域对应的文件内容。
        2.类型为String的xxxFileName属性:用来封装该文件域对应的文件的文件名。
        3.类型为String的xxxContentType属性:用来封装该文件域应用的文件的文件类型。
     */
    private File file;
    private String fileFileName;
    private String fileContentType;
    private String message;
    private String fileSize;
//  @Inject("struts.multipart.saveDir")
//  @Inject("saveDir")
    private String saveDir;

    private List<File> files;
    private List<String> filesFileName;
    private List<String> filesContentType;
    private List<String> filesSize = new ArrayList<String>();
    private List list;

    public String uploadAFile() throws Exception {
//      String root = ServletActionContext.getServletContext().getRealPath("/upload");
        InputStream is = new FileInputStream(file);
//      fileSize = is.available()/1000 +"KB";
        formatFileSize(is.available());
        File f1 = new File(saveDir, fileFileName);
        System.out.println(f1.getAbsolutePath());
        OutputStream os = new FileOutputStream(f1);

        System.out.println("fileName : " + fileFileName);
        System.out.println("file content type : " + fileContentType);
        System.out.println("File size: " + fileSize);
//      System.out.println("===========================");
        /**
         * 下面两行code得到临时文件名和临时存放路径
         */
//      System.out.println("file : "  + file.getName());
//      System.out.println("file : "  + file.getPath());


        byte []buffer = new byte[256];
        int length = 0;

        while((length = is.read(buffer, 0, buffer.length)) != -1){
            os.write(buffer);
            /*
             * 给buffer重新分配空间
             * 如果不重新分配空间,每次都会把下次的数据覆盖到缓存空间,
             * 若最后剩下的数据不满足缓存空间的时候,先把最后的data 覆盖到前面的部分缓存区,
             * 剩下未填满的区域任是上个data中保存的数据,会造成文件的内容和原本上传的文件不一样
             */
            buffer = new byte[256];
        }

        os.close();
        is.close();

//      ActionContext.getContext().put("message", "upload Success.");

        return SUCCESS;
    }

    public void formatFileSize(long fileSize){
        double size = fileSize/1000.0;
        DecimalFormat format = new DecimalFormat("#.##");
        this.fileSize = format.format(size) + "KB";
    }

    public String uploadFiles() throws Exception {
        for(int i=0;i<files.size();i++){
            File file = files.get(i);
            InputStream is = new FileInputStream(file);
            String size = is.available()/1000 +"KB";
            filesSize.add(size);
            File fl = new File(saveDir, filesFileName.get(i));
            OutputStream os = new FileOutputStream(fl);

            System.out.println("File Name: " + filesFileName.get(i));
            System.out.println("File Content Type: " + filesContentType.get(i));

            byte []buffer = new byte[256];
            int length = 0;
            while((length = is.read(buffer, 0, buffer.length)) != -1){
                os.write(buffer);
                buffer = new byte[256];
            }
            os.close();
            is.close();
        }
        return SUCCESS;
    }

     //返回一个输入流,作为一个客户端来说是一个输入流,但对于服务器端是一个 输出流  
    @SuppressWarnings("unchecked")
    public InputStream getInputStream() throws Exception{
//      ServletActionContext.getServletContext()
        /*
         * 转换文件名编码,否则遇到中文文件名会出现乱码
         */
        fileFileName = new String(fileFileName.getBytes("ISO-8859-1"),"UTF-8");
        System.out.println(fileFileName);
        Object []objs = (Object[]) ActionContext.getContext().getSession().get("uploadFiles");
        /*
         * 从上传文件的文件夹中找到对应的文件的路径
         */
        String filePath = null;
        for(Object o : objs){
//          String path = file.getAbsolutePath();
            if(String.valueOf(o).contains(fileFileName)){
                filePath = String.valueOf(o);
                break;
            }
        }
        /*
         * 将文件名的编码转换成原先的编码,否则在下载的文件名处中文文件名显示可能会出问题
         * struts2 在struts.xml 的配置中将文件名传到客户端
         */
        fileFileName = new String(fileFileName.getBytes("UTF-8"),"ISO-8859-1");
        InputStream is = new FileInputStream(filePath);
        return is;
//      return ServletActionContext.getServletContext().getResourceAsStream("upload/" + fileFileName);
    }

    public String listAllUploadFiles() throws Exception {
        getListFilesInUploadFile();
        return SUCCESS;
    }

    public List<File> getListFilesInUploadFile() throws IOException{
    /*
         * 将上传的文件路径保存到upload.properties中,download的时候从properties文件中读取路径
         */
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("upload.properties");
        Properties p = new Properties();
        p.load(is);

        saveDir = String.valueOf(p.get("saveDir"));

        File file = new File(saveDir);
        list = Arrays.asList(file.list());
        is.close();
        ActionContext.getContext().getSession().put("uploadFiles", file.listFiles());
        return Arrays.asList(file.listFiles());
    }

    public String downloadFile() throws Exception {
        return SUCCESS;
    }

    public File getFile() {
        return file;
    }

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


    public String getFileFileName() {
        return fileFileName;
    }

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

    public String getFileContentType() {
        return fileContentType;
    }

    public void setFileContentType(String fileContentType) {
        this.fileContentType = fileContentType;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getSaveDir() {
        return saveDir;
    }

    public void setSaveDir(String saveDir) {
        this.saveDir = saveDir;
    }

    public List<File> getFiles() {
        return files;
    }

    public void setFiles(List<File> files) {
        this.files = files;
    }

    public List<String> getFilesFileName() {
        return filesFileName;
    }

    public void setFilesFileName(List<String> filesFileName) {
        this.filesFileName = filesFileName;
    }

    public List<String> getFilesContentType() {
        return filesContentType;
    }

    public void setFilesContentType(List<String> filesContentType) {
        this.filesContentType = filesContentType;
    }

    public String getFileSize() {
        return fileSize;
    }

    public void setFileSize(String fileSize) {
        this.fileSize = fileSize;
    }

    public List<String> getFilesSize() {
        return filesSize;
    }

    public void setFilesSize(List<String> filesSize) {
        this.filesSize = filesSize;
    }

    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }


}

Struts.xml

<!--解决乱码    -->
<constant name="struts.i18n.encoding" value="UTF-8" />

<package name="upload" namespace="/upload" extends="struts-default">
        <global-results>
            <result name="error">/error.jsp</result>
            <result name="input">/error.jsp</result>
        </global-results>


        <action name="uploadAFile" class="action.FileUploadAction" method="uploadAFile">
            <param name="saveDir">c:\tempUpload</param>
            <result name="success">/upload/uploadSuccess.jsp</result>
        </action>

        <action name="uploadFiles" class="action.FileUploadAction" method="uploadFiles">
            <!-- saveDir 上传文件路径 -->
            <param name="saveDir">c:\tempUpload</param>
            <result name="success">/upload/uploadFilesSuccess.jsp</result>
        </action>

        <action name="listAllUploadFiles" class="action.FileUploadAction" method="listAllUploadFiles">
            <result name="success">/upload/listAllUploadFiles.jsp</result>
        </action>

        <action name="downloadFile" class="action.FileUploadAction" method="downloadFile">
            <result name="success" type="stream">
                <param name="contentType">application/octet-stream;charset=utf-8</param>
                <param name="inputName">inputStream</param> 
                <param name="contentDisposition">attachment;filename="${fileFileName}"</param>
                <param name="bufferSize">4096</param>
            </result>
        </action>
    </package>

当result为stream类型时,struts2会自动根据你配置好的参数下载文件。

其中主要使用的参数是:
contentType 指定下载文件的文件类型 —— application/octet-stream 表示无限制
inputName 流对象名 —— 比如这里写inputStream,它就会自动去找Action中的getInputStream方法。
contentDisposition 使用经过转码的文件名作为下载文件名 —— 默认格式是attachment;filename=”${fileFileName}”,将调用该Action中的getFileFileName方法。
bufferSize 下载文件的缓冲大小

说明:
以上code 解决上传过程中比如中文、日文等乱码问题,可以上传任意文件。基本需要注意的都添加注释了。
但是对于生僻字仍旧是乱码,不知道什么原因。

从测试人员那得到的生僻字:(把生僻字放到文档中上传乱码,搞的眼疼也没找到原因,望指教)
ÇàâアイウДфэأبتثअइउ鯵㈱表噂ソ十豹竹敷~兎椄*@'愛金รื่ญูฏู鷗㐀葛渚噓������か゚啊☆€㐁ᠠﭖꀀༀ䨭抎駡U郂 鯵㈱表噂ソ十豹竹敷~兎椄*@'
~乱码问题搞得真难受,哎~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值