Java上传下载文件并实现加密解密

使用 Jersey 服务器实现上传,使用 HTTP 请求实现下载

引入依赖

在 pom.xml 中添加 Jersey 相关依赖

<dependency>
  <groupId>com.sun.jersey</groupId>
  <artifactId>jersey-client</artifactId>
  <version>1.18.1</version>
</dependency>

创建工具类

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientHandlerException;
import com.sun.jersey.api.client.UniformInterfaceException;
import com.sun.jersey.api.client.WebResource;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.UUID;

public class FileUtils {

  // 加密/解密文件的密钥
  public static final int CRYPTO_SECRET_KEY = 0x99;

  public static int FILE_DATA = 0;

  /**
   * 加密/解密 文件
   * @param srcFile 原文件
   * @param encFile 加密/解密后的文件
   * @throws Exception
   */
  public static void cryptoFile(File srcFile, File encFile) throws Exception {

    InputStream inputStream = new FileInputStream(srcFile);
    OutputStream outputStream = new FileOutputStream(encFile);
    while ((FILE_DATA = inputStream.read()) > -1) {
      outputStream.write(FILE_DATA ^ CRYPTO_SECRET_KEY);
    }
    inputStream.close();
    outputStream.flush();
    outputStream.close();
  }

  /**
   * MultipartFile 生成临时文件
   * @param multipartFile
   * @param tempFilePath 临时文件路径
   * @return File 临时文件
   */
  public static File multipartFileToFile(MultipartFile multipartFile, String tempFilePath) {

    File file = new File(tempFilePath);
    // 获取文件原名
    String originalFilename = multipartFile.getOriginalFilename();
    // 获取文件后缀
    String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
    if (!file.exists()) {
      file.mkdirs();
    }
    // 创建临时文件
    File tempFile = new File(tempFilePath + "\\" + UUID.randomUUID().toString().replaceAll("-", "") + suffix);
    try {
      if (!tempFile.exists()) {
        // 写入临时文件
        multipartFile.transferTo(tempFile);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
    return tempFile;
  }

  /**
   * 上传文件
   * @param fileServerPath	文件服务器地址
   * @param folderPath  存放的文件夹路径(比如存放在文件服务器的 upload 文件夹下,即 ”/upload“)
   * @param uploadFile	需要上传的文件
   * @param isCrypto	是否加密
   * @return String	文件上传后的全路径
   */
  public static String uploadByJersey(String fileServerPath, String folderPath, File uploadFile, boolean isCrypto) {

    String suffix = uploadFile.getName().substring(uploadFile.getName().lastIndexOf("."));
    String randomFileName = UUID.randomUUID().toString().replaceAll("-", "") + suffix;
    String fullPath = fileServerPath + folderPath + "/" + randomFileName;
    try {
      if (isCrypto) {
        // 创建加密文件
        File cryptoFile = new File(uploadFile.getPath().substring(0, uploadFile.getPath().lastIndexOf(".")) + "crypto" + uploadFile.getPath().substring(uploadFile.getPath().lastIndexOf(".")));
        // 执行加密
        cryptoFile(uploadFile, cryptoFile);
        // 保存加密后的文件
        uploadFile = cryptoFile;
      }
      // 创建 Jersey 服务器
      Client client = Client.create();
      WebResource wr = client.resource(fullPath);
      // 上传文件
      wr.put(String.class, fileToByte(uploadFile));
    } catch (Exception e) {
      e.printStackTrace();
    }
    return fullPath;
  }

  /**
   * 下载文件
   * @param url  文件路径
   * @param filePath 文件保存路径
   * @param fileName	文件名称(包含文件后缀)
   * @param isCrypto 是否解密
   * @return File
   */
  public static File downloadByURL(String url, String filePath, String fileName, boolean isCrypto) {

    File file = new File(filePath);
    if (!file.exists()) {
      file.mkdirs();
    }
    FileOutputStream fileOut;
    HttpURLConnection httpURLConnection;
    InputStream inputStream;
    try {
      URL httpUrl = new URL(url);
      httpURLConnection = (HttpURLConnection) httpUrl.openConnection();
      httpURLConnection.setDoInput(true);
      httpURLConnection.setDoOutput(true);
      httpURLConnection.setUseCaches(false);
      httpURLConnection.connect();
      inputStream = httpURLConnection.getInputStream();
      BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
      if (!filePath.endsWith("\\")) {
        filePath += "\\";
      }
      file = new File(filePath + fileName);
      fileOut = new FileOutputStream(file);
      BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOut);
      byte[] bytes = new byte[4096];
      int length = bufferedInputStream.read(bytes);
      //保存文件
      while (length != -1) {
        bufferedOutputStream.write(bytes, 0, length);
        length = bufferedInputStream.read(bytes);
      }
      bufferedOutputStream.close();
      bufferedInputStream.close();
      httpURLConnection.disconnect();
    } catch (Exception e) {
      e.printStackTrace();
    }
    if (isCrypto) {
      try {
        // 创建解密文件
        File cryptoFile = new File(((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getServletContext().getRealPath("/") + "\\temp\\" + UUID.randomUUID().toString().replaceAll("-", "") + file.getName().substring(file.getName().lastIndexOf(".")));
        // 执行解密
        cryptoFile(file, cryptoFile);
        // 删除下载的原文件
        file.delete();
        // 保存解密后的文件
        file = cryptoFile;
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return file;
  }

  /**
   * 删除文件服务器上的文件
   * @param url 文件路径
   * @return boolean
   */
  public static boolean deleteByJersey(String url) {

    try {
      Client client = new Client();
      WebResource webResource = client.resource(url);
      webResource.delete();
      return true;
    } catch (UniformInterfaceException e) {
      e.printStackTrace();
    } catch (ClientHandlerException e) {
      e.printStackTrace();
    }
    return false;
  }

  /**
   * File转Bytes
   * @param file
   * @return byte[]
   */
  public static byte[] fileToByte(File file) {

    byte[] buffer = null;
    try {
      FileInputStream fileInputStream = new FileInputStream(file);
      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
      byte[] bytes = new byte[1024];
      int n;
      while ((n = fileInputStream.read(bytes)) != -1) {
        byteArrayOutputStream.write(bytes, 0, n);
      }
      fileInputStream.close();
      byteArrayOutputStream.close();
      buffer = byteArrayOutputStream.toByteArray();
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return buffer;
  }
}

测试上传

/**
 * @param multipartFile 上传文件
 * @param isCrypto 是否加密文件
 * @return
 */
@Test
public String upload(MultipartFile multipartFile, boolean isCrypto) {

  HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  // 生成临时文件
  File tempFile = FileUtil.multipartFileToFile(multipartFile, request.getServletContext().getRealPath("/") + "\\static\\temp");
  // 上传文件并返回文件路径
  String uploadFilePath = FileUtil.uploadByJersey("http://localhost:8080", "/upload", tempFile, isCrypto);
  if (uploadFilePath != null) {
    return "上传成功";
  }
  else {
    return "上传失败";
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java文件上传下载代码实例

    本文实例为大家分享了java文件上传下载的具体代码,供大家参考,具体内容如下 文件上传 @RequestMapping(value="/uploadFile",method=RequestMethod.POST) public ResultObject uploadFiles(@RequestParam("file")MultipartFile file,HttpServletRequest request){ ResultObject rs = null;//返回

  • Java文件上传与文件下载实现方法详解

    本文实例讲述了Java文件上传与文件下载实现方法.分享给大家供大家参考,具体如下: Java文件上传 数据上传是客户端向服务器端上传数据,客户端向服务器发送的所有请求都属于数据上传.文件上传是数据上传的一种特例,指客户端向服务器上传文件.即将保存在客户端的文件上传一个副本到服务器,并保存在服务器中. 1.上传表单要求 文件上传要求客户端提交特殊的请求--multipart请求,即包含多部分数据的请求.必须将<form/>标签的enctype属性值设为"multipart/form-d

  • JavaServlet的文件上传和下载实现方法

    先分析一下上传文件的流程 1-先通过前段页面中的选择文件选择要上传的图片 index.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; charset=UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 T

  • java利用Apache commons codec进行MD5加密,BASE64加密解密,执行系统命令

    编写代码之前先来介绍一下我们要用到的两个包; commons-codec-1.10.jar Commons项目中用来处理常用的编码方法的工具类包,例如DES.SHA1.MD5.Base64,URL,Soundx等等. commons-exec-1.3.jar Apache Commons Exec 是 Apache 上的一个 Java 项目,提供一些常用的方法用来执行外部进程 你可以到本站直接下载 Apache Commons 官方包 下面看一下代码结构: import org.apache.c

  • java使用Base64实现文件加密解密

    本文实例为大家分享了Java实现Base64给文件加密.解密的具体代码,供大家参考,具体内容如下 package test.base64; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import sun.misc.BASE64Decoder;

  • java实现文件上传、下载、图片预览

    这篇文章主要介绍了java实现文件上传.下载.图片预览,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 多文件保存到本地: @ResponseBody @RequestMapping(value = "/uploadApp",produces = { "application/json;charset=UTF-8" },method= RequestMethod.POST) public String uploadA

  • 如何通过Java实现加密、解密Word文档

    前言 对一些重要文档,我们为保证其文档内容不被泄露,常需要对文件进行加密,查看文件时,需要正确输入密码才能打开文件.下面介绍了一种比较简单的方法给Word文件加密以及如何给已加密的Word文件解除密码保护. 使用工具:Free Spire.Doc for Java 2.0.0(免费版) Jar文件导入: 方法1:通过官网下载控件包.在程序下新建一个directory目录,并命名(本示例中命名为lib):将控件包lib文件夹下的jar(如下图1)拷贝到程序中新建的目录下.复制jar文件后,鼠标右键

  • 基于Java文件输入输出流实现文件上传下载功能

    本文为大家分享了Java实现文件上传下载功能的具体代码,供大家参考,具体内容如下 前端通过form表单的enctype属性,将数据传递方式修改为二进制"流"的形式,服务端(servlet)通过  getInputStream() 获取流信息, 运用java I/O 流的基础操作将流写入到一个服务端临时创建的文件temp中,然后再次利用文件基本操作,读取并截取临时文件内容,根据其中信息创建相应的文件,将读取出来的具体信息写入,下载时,根据提交的文件名称,找到服务器端相应的文件,然后根据输

  • Java上传下载文件并实现加密解密

    使用 Jersey 服务器实现上传,使用 HTTP 请求实现下载 引入依赖 在 pom.xml 中添加 Jersey 相关依赖 <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.18.1</version> </dependency> 创建工具类 import com.

  • Java Spring MVC 上传下载文件配置及controller方法详解

    下载: 1.在spring-mvc中配置(用于100M以下的文件下载) <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <!--配置下载返回类型--> <bean class="or

  • JAVA技术实现上传下载文件到FTP服务器(完整)

    具体详细介绍请看下文: 在使用文件进行交互数据的应用来说,使用FTP服务器是一个很好的选择.本文使用Apache Jakarta Commons Net(commons-net-3.3.jar) 基于FileZilla Server服务器实现FTP服务器上文件的上传/下载/删除等操作. 关于FileZilla Server服务器的详细搭建配置过程,详情请见 FileZilla Server安装配置教程 .之前有朋友说,上传大文件(几百M以上的文件)到FTP服务器时会重现无法重命名的问题,但本人亲

  • java webservice上传下载文件代码分享

    本文实例为大家分享了java webservice上传下载文件代码,供大家参考,具体内容如下 1.新建动态web工程youmeFileServer,新建包com,里面新建类FileProgress package com; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.sql.Date; import java.text.Simple

  • SpringMVC实现上传下载文件

    本文实例为大家分享了SpringMVC实现上传下载文件的具体代码,供大家参考,具体内容如下 一.SpringMVC专门提供了CommonsMultipartResolver组件用于文件上传: (1)maxUploadSize 文件最大限制,单位是byte(2)maxInMemorySize 低于这个大小的文件暂存内存中(3)defaultEncoding 默认编码utf-8 必须在spring-mvc.xml文件 <!-- (2)配置 MultipartResolver 实现文件上传     

  • python实现支持目录FTP上传下载文件的方法

    本文实例讲述了python实现支持目录FTP上传下载文件的方法.分享给大家供大家参考.具体如下: 该程序支持ftp上传下载文件和目录.适用于windows和linux平台. #!/usr/bin/env python # -*- coding: utf-8 -*- import ftplib import os import sys class FTPSync(object): conn = ftplib.FTP() def __init__(self,host,port=21): self.c

  • 使用smartupload组件实现jsp+jdbc上传下载文件实例解析

    SmartUpload组件只有5个分别是:File.Files.Request.SmartUpload.SmartUploadException类,其中,File代表用户上传的文件,Files代表用户上传的多个文件,Request相当于HttpServletRequest的功能,用于获取表单数据,SmartUpload是最核心的类,负责文件上传下载,SmartUploadException是自定义异常.    SmartUpload的基本使用思路如下: jsp前台代码表单提交 <form act

  • python实现上传下载文件功能

    最近刚学python,遇到上传下载文件功能需求,记录下! django web项目,前端上传控件用的是uploadify. 文件上传 - 后台view 的 Python代码如下: @csrf_exempt @require_http_methods(["POST"]) def uploadFiles(request): try: user = request.session.get('user') allFimeNames = "" #获取所有上传文件 files

  • python实现的简单FTP上传下载文件实例

    本文实例讲述了python实现的简单FTP上传下载文件的方法.分享给大家供大家参考.具体如下: python本身自带一个FTP模块,可以实现上传下载的函数功能. #!/usr/bin/env python # -*- coding: utf-8 -*- from ftplib import FTP def ftp_up(filename = "20120904.rar"): ftp=FTP() ftp.set_debuglevel(2) #打开调试级别2,显示详细信息;0为关闭调试信息

  • Linux下scp无密码上传 下载 文件 目录的方法

    在Linux下远程备份的时候,需要配置scp的 无密码复制文件.目录.就把这个设置整理如下: 本地服务器:A 远程服务器:B 1.在 A 上运行 ssh-keygen -t rsa 在/root/.ssh 下生成id_rsa 和 id_rsa.pub 两个文件 在/root/.ssh下复制备份一份id_rsa.pub 命名为 id_rsa.pub.A 如图所示 2. 在 B 上也同样运行 ssh-keygen -t rsa 3. 在 B 的 /root/.ssh 下创建authorized_ke

随机推荐