Java 文件上传与下载

日常开发中,时常遇到文件的上传与下载。这里就文件的上传和下载功能做一个共通的Java类,方便以后调用!

1.首先是文件的下载共通类:


    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.net.URI;
    import java.net.URL;
    import java.net.URLEncoder;

    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;

    import com.oreilly.servlet.ServletUtils;

    public class FileDownloadUtil {
        public static String constFileName(String fileName) {
            return fileName.substring(0, fileName.indexOf(".") - 24) + fileName.substring(fileName.indexOf("."));
        }

        /**
         * 下载文件接口
         * 
         * @param request
         * @param response
         * @author wul
         * @return
         */
        public void downloadFile(HttpServletRequest request, HttpServletResponse response) {

            String fileDirStr = request.getParameter("fileDir").replace("/", "\\\\");
            // 获取文件名称
            int bIndex = fileDirStr.indexOf("\\", 2);
            String fileName = fileDirStr.substring(bIndex + 2, fileDirStr.length());
            fileDirStr = fileDirStr.replace("\\", "/");
            try {
                /* 封装请求路径 */
                URL url = new URL(SystemPropertyHandler.getProperty("fileServerURL") + fileDirStr);
                URI uri = new URI(url.getProtocol(), url.getHost() + ":" + url.getPort(), url.getPath(), url.getQuery(), null);
                // 构造Http请求
                HttpClient client = new DefaultHttpClient();
                HttpPost post = new HttpPost(uri);

                // 执行请求
                HttpResponse responses = client.execute(post);

                // 获得请求文件输入流
                InputStream is = responses.getEntity().getContent();

                // 生命字节码
                int read = 0;
                byte[] bytes = new byte[1024];

                String PROCESSPATH_JILIANG = fileName;
                String path = request.getSession().getServletContext().getRealPath(PROCESSPATH_JILIANG);

                // 将输入流持久化写入本地文件流
                FileOutputStream fo = new FileOutputStream(path);
                // OutputStream os = response.getOutputStream();
                while ((read = is.read(bytes)) != -1) {
                    fo.write(bytes, 0, read);
                }
                // 转换文件名称Byte,支持中文文件名
                fileName = new String(fileName.getBytes("utf8"), "utf-8");
                fileName = constFileName(fileName);
                fileName = URLEncoder.encode(fileName, "UTF-8");
                fileName = fileName.replace("+", " ");
                // 设置response响应头
                // 把响应设置为二进制流 ,* = application/octet-stream 可下载任何类型的文件
                // setContentType浏览器会开启下载框
                response.setContentType("application/octet-stream;charset=UTF-8");
                // 设置编码
                request.setCharacterEncoding("UTF-8");
                response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

                ServletOutputStream out = null;
                try {
                    out = response.getOutputStream();
                    // 输出到页面下载框
                    ServletUtils.returnFile(path, out);

                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (null != out) {
                        out.close();
                    }
                    fo.close();
                    File file = new File(path);
                    file.delete();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        /**
         * 下载文件
         * 
         * @param fileDir
         */
        public static String downloadFile(String fileDir, String directory) {

            String fileDirStr = fileDir.replace("/", "\\\\");
            // 获取文件名称
            int bIndex = fileDirStr.indexOf("\\", 2);
            String fileName = fileDirStr.substring(bIndex + 2, fileDirStr.length());
            fileDirStr = fileDirStr.replace("\\", "/");
            try {
                /* 封装请求路径 */
                URL url = new URL(SystemPropertyHandler.getProperty("fileServerURL") + fileDirStr);
                URI uri = new URI(url.getProtocol(), url.getHost() + ":" + url.getPort(), url.getPath(), url.getQuery(), null);
                // 构造Http请求
                HttpClient client = new DefaultHttpClient();
                HttpPost post = new HttpPost(uri);
                // 执行请求
                HttpResponse responses = client.execute(post);
                // 获得请求文件输入流
                InputStream is = responses.getEntity().getContent();
                // 生命字节码
                int read = 0;
                byte[] bytes = new byte[1024];
                fileName = constFileName(fileName);
                fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
                String path = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getSession().getServletContext().getRealPath(directory + fileName);
                // 将输入流持久化写入本地文件流
                FileOutputStream fo = new FileOutputStream(path);
                while ((read = is.read(bytes)) != -1) {
                    fo.write(bytes, 0, read);
                }
                fo.close();
                return path;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }
该类提供了两种不同的传参方式,第一种方法参数为 HttpServletRequest request, HttpServletResponse response,通过 request 获取服务器文件路径 fileDir,通过 response 设置发送到客户端的响应的内容类型及响应头。第二种方法则直接传服务器文件地址,下载到本地的地址。这里的 SystemPropertyHandler 类是读取配置文件的共通类,主要用来读取配置文件中配置的下载及上传地址等相关信息。

2.再就是文件的上传共通类:

    import java.io.File;
    import java.net.URLEncoder;
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Enumeration;
    import java.util.List;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.mime.HttpMultipartMode;
    import org.apache.http.entity.mime.MultipartEntity;
    import org.apache.http.entity.mime.content.ContentBody;
    import org.apache.http.entity.mime.content.FileBody;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    import org.springframework.web.multipart.MultipartFile;

    import com.oreilly.servlet.MultipartRequest;

    public class FileUploadUtil {

        /**
         * 重写generateContentType,去掉charset的设置,浏览器不设置charset,这里的post请求也要去掉charset的设置
         * @author Administrator
         *
         */
        public class CustomMultipartEntity extends MultipartEntity {

            public CustomMultipartEntity(
                    HttpMultipartMode mode,
                    String boundary,
                    Charset charset){
                super(mode,boundary,charset);
            }

            @Override
            protected String generateContentType(
                    final String boundary,
                    final Charset charset) {
                StringBuilder buffer = new StringBuilder();
                buffer.append("multipart/form-data; boundary=");
                buffer.append(boundary);
    //          if (charset != null) {
    //              buffer.append("; charset=");
    //              buffer.append(charset.name());
    //          }
                return buffer.toString();
            }
        }

        /**
         * 上传文件接口
         * 
         * @param request
         * @param response
         * @return
         */

        public String uploadFileTest(MultipartFile file) {
            String strUtil = "";
            try {
                File uploadFile = this.mkFileTest(file);
                String fileDir = this.construFolderName();

                // 构造上传文件
                MultipartEntity mpEntity = new CustomMultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,null,Charset.forName("utf-8"));
                ContentBody cbFile = new FileBody(uploadFile);
                mpEntity.addPart("userfile", cbFile);

                // 构造Http请求
                HttpClient client = new DefaultHttpClient();
                HttpPost post = new HttpPost(SystemPropertyHandler.getProperty("fileServerPath")
                        + fileDir);
                post.setEntity(mpEntity);
                // 执行请求
                HttpResponse responses = client.execute(post);

                // 接收请求返回值
                strUtil =EntityUtils.toString(responses.getEntity(), "utf-8");

            } catch (Exception e) {
                e.printStackTrace();
            }
            return strUtil;
        }

        /**
         * 上传文件接口
         * 
         * @param request
         * @param response
         * @return
         */

        public String uploadFileDwj(HttpServletRequest request,
                HttpServletResponse response) {
            String strUtil = "";
            try {
                List<File> uploadFiles = this.mkFileDwj(request);
                String fileDir = this.construFolderName();

                for(File uploadFile : uploadFiles){
                    // 构造上传文件
                    MultipartEntity mpEntity = new CustomMultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,null,Charset.forName("utf-8"));
                    ContentBody cbFile = new FileBody(uploadFile);
                    mpEntity.addPart("userfile", cbFile);

                    // 构造Http请求
                    HttpClient client = new DefaultHttpClient();
                    HttpPost post = new HttpPost(SystemPropertyHandler.getProperty("fileServerPath")
                            + fileDir);
                    post.setEntity(mpEntity);
                    // 执行请求
                    HttpResponse responses = client.execute(post);

                    // 接收请求返回值
                    strUtil =EntityUtils.toString(responses.getEntity(), "utf-8");
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
            return strUtil;
        }

        /**
         * 上传文件接口
         * 
         * @param request
         * @param response
         * @return
         */

        public String uploadFile(HttpServletRequest request,
                HttpServletResponse response) {
            String strUtil = "";
            try {
                File uploadFile = this.mkFile(request);
                String fileDir = this.construFolderName();

                // 构造上传文件
                MultipartEntity mpEntity = new CustomMultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,null,Charset.forName("utf-8"));
                ContentBody cbFile = new FileBody(uploadFile);
                mpEntity.addPart("userfile", cbFile);

                // 构造Http请求
                HttpClient client = new DefaultHttpClient();
                HttpPost post = new HttpPost(SystemPropertyHandler.getProperty("fileServerPath")
                        + fileDir);
                post.setEntity(mpEntity);
                // 执行请求
                HttpResponse responses = client.execute(post);

                // 接收请求返回值
                strUtil =EntityUtils.toString(responses.getEntity(), "utf-8");

            } catch (Exception e) {
                e.printStackTrace();
            }
            return strUtil;
        }

        public String uploadFile(String file) {
            String strUtil = "";
            try {
                File uploadFile = new File(file);
                String fileDir = this.construFolderName();

                // 构造上传文件
                MultipartEntity mpEntity = new CustomMultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,null,Charset.forName("utf-8"));
                ContentBody cbFile = new FileBody(uploadFile);
                mpEntity.addPart("userfile", cbFile);

                // 构造Http请求
                HttpClient client = new DefaultHttpClient();
                HttpPost post = new HttpPost(SystemPropertyHandler.getProperty("fileServerPath")
                        + fileDir);
                post.setEntity(mpEntity);
                // 执行请求
                HttpResponse responses = client.execute(post);

                // 接收请求返回值
                strUtil =EntityUtils.toString(responses.getEntity(), "utf-8");

            } catch (Exception e) {
                e.printStackTrace();
            }
            return strUtil;
        }

        /**
         * 删除文件接口
         * 
         * @param request
         * @param response
         * @author nlb
         * @return
         */

        public String delFile(HttpServletRequest request,
                HttpServletResponse response,String fileName) {
            String strUtil = "";
            try {
                request.setCharacterEncoding("UTF-8");
                // 构造Http请求
                HttpClient client = new DefaultHttpClient();
                HttpPost post = new HttpPost(SystemPropertyHandler.getProperty("fileDeleteServerPath")
                        + URLEncoder.encode(fileName,"utf-8"));
    //          post.setEntity(mpEntity);
                // 执行请求
                HttpResponse responses = client.execute(post);

                // 接收请求返回值
                strUtil =EntityUtils.toString(responses.getEntity(), "utf-8");

            } catch (Exception e) {
                e.printStackTrace();
            }
            return strUtil;
        }

        /**
         * 生成文件保存路径 生成规则 年-月
         * 
         * @author wul
         * @return
         */
        public static String construFolderName() {
            Calendar now = Calendar.getInstance();
            String fileDirStr = now.get(Calendar.YEAR) + "-"
                    + (now.get(Calendar.MONTH) + 1);
            return fileDirStr;
        }

        /**
         * 生成文件接口
         * @param request
         * @param response
         * @return
         * @throws Exception 
         */
        public File mkFileTest(MultipartFile file) throws Exception {
            // 设置上传文件的大小,超过这个大小 将抛出IOException异常,默认大小是10M。
            int inmaxPostSize = 10 * 1024 * 1024;
            long size= file.getSize();
            if(size > inmaxPostSize){
                throw new Exception("超出大小限制!");
            }
            // 获取文件在文档服务器中的保存路径
            //String fileDirStr = this.construFolderName();
            System.out.println(file.getOriginalFilename());
            File result = new File("111.xml");
            file.transferTo(result);
            System.out.println(result.getAbsolutePath());
            return result;
        }

        /**
         * 生成文件接口
         * 
         * @author wul
         * @param request
         * @param response
         * @return
         */
        public List<File> mkFileDwj(HttpServletRequest request) {
            // 获取文件在文档服务器中的保存路径
            String fileDirStr = this.construFolderName();

            // 确定文件的保存位置
            File fileDir = new File(request.getServletContext().getRealPath(
                    "/FileDir/" + fileDirStr));
            if (!fileDir.exists()) {
                fileDir.mkdirs();
            }

            // 设置上传文件的大小,超过这个大小 将抛出IOException异常,默认大小是10M。
            int inmaxPostSize = 10 * 1024 * 1024;
            MultipartRequest multirequest = null;

            try {
                // MultipartRequest()有8种构造函数!
                multirequest = new MultipartRequest(request,
                        fileDir.getAbsolutePath(), inmaxPostSize, "utf-8"); // GBK中文编码模式上传文件

                Enumeration<String> filedFileNames = multirequest.getFileNames();
                String filedName = null;
                List<File> list = new ArrayList<File>();
                if (null != filedFileNames) {
                    while (filedFileNames.hasMoreElements()) {

                        filedName = filedFileNames.nextElement();// 文件文本框的名称
                        // 获取该文件框中上传的文件,即对应到上传到服务器中的文件  
                        File uploadFile = multirequest.getFile(filedName);
                        list.add(uploadFile);
                    }
                }

                return list;

            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        /**
         * 生成文件接口
         * 
         * @author wul
         * @param request
         * @param response
         * @return
         */
        public File mkFile(HttpServletRequest request) {
            // 获取文件在文档服务器中的保存路径
            String fileDirStr = this.construFolderName();

            // 确定文件的保存位置
            File fileDir = new File(request.getServletContext().getRealPath(
                    "/FileDir/" + fileDirStr));
            if (!fileDir.exists()) {
                fileDir.mkdirs();
            }

            // 设置上传文件的大小,超过这个大小 将抛出IOException异常,默认大小是10M。
            int inmaxPostSize = 10 * 1024 * 1024;
            MultipartRequest multirequest = null;

            try {
                // MultipartRequest()有8种构造函数!
                multirequest = new MultipartRequest(request,
                        fileDir.getAbsolutePath(), inmaxPostSize, "utf-8"); // GBK中文编码模式上传文件

                Enumeration<String> filedFileNames = multirequest.getFileNames();
                String filedName = null;
                if (null != filedFileNames) {
                    while (filedFileNames.hasMoreElements()) {

                        filedName = filedFileNames.nextElement();// 文件文本框的名称
                        // 获取该文件框中上传的文件,即对应到上传到服务器中的文件  
                        File uploadFile = multirequest.getFile(filedName);
                        return uploadFile;

                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
        /**
         * 生成文件接口
         * 
         * @param request
         * @param response
         * @return
         */
        public File mkMaxFile(HttpServletRequest request) {
            // 获取文件在文档服务器中的保存路径
            String fileDirStr = this.construFolderName();

            // 确定文件的保存位置
            File fileDir = new File(request.getServletContext().getRealPath(
                    "/FileDir/" + fileDirStr));
            if (!fileDir.exists()) {
                fileDir.mkdirs();
            }

            // 设置上传文件的大小
            int inmaxPostSize = 500 * 1024 * 1024;
            MultipartRequest multirequest = null;
            try {
                // MultipartRequest()有8种构造函数!
                multirequest = new MultipartRequest(request,
                        fileDir.getAbsolutePath(), inmaxPostSize, "utf-8"); // GBK中文编码模式上传文件

                Enumeration<String> filedFileNames = multirequest.getFileNames();
                String filedName = null;
                if (null != filedFileNames) {
                    while (filedFileNames.hasMoreElements()) {

                        filedName = filedFileNames.nextElement();// 文件文本框的名称
                        // 获取该文件框中上传的文件,即对应到上传到服务器中的文件  
                        File uploadFile = multirequest.getFile(filedName);
                        return uploadFile;

                    }
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }

3.服务器端对上传下载的处理
在上面的上传和下载共通类中,使用了 SystemPropertyHandler 来读取上传和下载的 URL 请求,然后服务器端对请求的URL进行处理,如这里的上传URL为:http://192.168.0.20/FileBank/FileUpload?fileDir=,下载地址为 http://192.168.0.20/FileBank/FileDir/,删除地址为 http://192.168.0.20/FileBank/FileDelete?fileDir=。这里服务器端采用 Servlet 对请求的处理。下面就上传、下载和删除给出处理代码:
- 3.1 文件上传

import com.fable.filemanager.util.RenamePolicyCos;
import com.oreilly.servlet.MultipartRequest;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet({"/FileUpload"})
public class FileUpload extends HttpServlet
{
  private static final long serialVersionUID = 1L;

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
  {
    doPost(request, response);
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
  {
    String fileDirStr = request.getParameter("fileDir");
    File fileDir = new File(getServletContext().getRealPath("/FileDir/" + fileDirStr));

    if (!fileDir.exists()) {
      fileDir.mkdirs();
    }

    int inmaxPostSize = 10485760;
    MultipartRequest multirequest = null;

    RenamePolicyCos myRenamePolicyCos = new RenamePolicyCos();
    try
    {
      multirequest = new MultipartRequest(request, fileDir.getAbsolutePath(), inmaxPostSize, "utf-8", myRenamePolicyCos);

      Enumeration filedFileNames = multirequest.getFileNames();
      String filedName = null;
      if (null != filedFileNames)
        while (filedFileNames.hasMoreElements()) {
          filedName = (String)filedFileNames.nextElement();

          File uploadFile = multirequest.getFile(filedName);

          StringBuffer sbReturn = new StringBuffer();
          sbReturn.append("{");
          sbReturn.append("msg:\"{fileSize:'" + uploadFile.length() + "',fileName:'" + uploadFile.getName() + "',fileDir:'" + fileDirStr + "'}\"");

          sbReturn.append("}");
          response.setCharacterEncoding("utf-8");
          response.setContentType("text/html;charset=utf8");
          response.getWriter().write(sbReturn.toString());
        }
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }
}
  • 3.2 文件下载
import com.oreilly.servlet.ServletUtils;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet({"/FileDownload"})
public class FileDownload extends HttpServlet
{
  private static final long serialVersionUID = 1L;

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
  {
    doPost(request, response);
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
  {
    String fileDir = request.getParameter("fileDir");

    String filePath = "//filedir" + fileDir;

    String Originalname = "test.gif";
    String isofilename = new String(Originalname.getBytes("gb2312"), "ISO8859-1");

    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment; filename=" + isofilename);

    ServletOutputStream out = null;
    try {
      out = response.getOutputStream();
      ServletUtils.returnFile(filePath, out);

      if (null != out)
        out.close();
    }
    catch (Exception e)
    {
      e.printStackTrace();

      if (null != out)
        out.close();
    }
    finally
    {
      if (null != out)
        out.close();
    }
  }
}
  • 3.3 文件删除
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet({"/FileDelete"})
public class FileDelete extends HttpServlet
{
  private static final long serialVersionUID = 1L;

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
  {
    doPost(request, response);
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
  {
    String fileDirStr = request.getParameter("fileDir");
    String filename = new String(fileDirStr.getBytes("ISO-8859-1"), "utf-8");
    File fileDir = new File(getServletContext().getRealPath("/FileDir/" + filename));
    StringBuffer sbReturn = new StringBuffer();
    try {
      if ((fileDir.isFile()) && (fileDir.exists())) {
        fileDir.delete();
        sbReturn.append("{msg:\"删除成功\"}");
      } else {
        sbReturn.append("{msg:\"删除失败\"}");
      }
      response.setCharacterEncoding("utf-8");
      response.setContentType("text/html;charset=utf8");
      response.getWriter().write(sbReturn.toString());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

4.总结
上述就是简单的上传和下载的共通类实现。这里只是给出了如何上传文件到服务器上,如何从服务器下下载文件,以及删除服务器保存文件。在做文件上传和下载这类功能时,建表最好有文件名,服务器路径、大小等一些信息。接下来会写一篇使用springmvc框架,从控制层,服务层来具体实现如何进行文件的上传和下载等功能!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值