java上传加密_Java上传下载文件并实现加密解密
使用 Jersey 服务器实现上传,使用 HTTP 请求实现下载
引入依赖
在 pom.xml 中添加 Jersey 相关依赖
com.sun.jersey
jersey-client
1.18.1
创建工具类
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 "上传失败";
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
java上传加密_Java上传下载文件并实现加密解密相关推荐
- java 文件下载详解_Java 从网上下载文件的几种方式实例代码详解
废话不多说了,直接给大家贴代码了,具体代码如下所示: package com.github.pandafang.tool; import java.io.BufferedOutputStream; i ...
- Java Web实现 使用浏览器从服务器下载文件
Java Web实现 使用浏览器从服务器下载文件. 代码实现: package com.juneyaoair.util;import lombok.SneakyThrows;import javax. ...
- java byte转文件大小_java上传文件大小转换(字节转kb/mb/gb)
/** * 字节转kb/mb/gb * @param size * @return */ public String getPrintSize(long size) { //如果字节数少于1024,则 ...
- java是怎么实现文件上传的_java怎么实现大文件上传
Q1:javaWeb能和ftp实现大文件上传吗 java上传可以使用common-fileupload上传组件的.common-fileupload是jakarta项目组开发的一个功能很强大的上传文件 ...
- java 文件上传 大小_java 上传文件大小转换为 GB/MB/KB/B
1.工具类 package cn.cmodes.common.utils; import java.io.File; import java.io.FileInputStream; import ja ...
- java http 下载网页代码_Java下http下载文件客户端和上传文件客户端实例代码
Java下http下载文件客户端和上传文件客户端实例代码 发布于 2021-1-14| 复制链接 摘记: 一.下载客户端代码 ```java package javadownload; import ...
- java下载的文件不完整_JAVA 解决FTP下载文件不完整问题
在使用java的ftp下载服务器上的文件获取文件的byte[],然后对byte进行加密传输时, 注意是要获取byte[],而不是下载文件到本地: 发现下载的byte[]大小总是小于文件实际大小,并且下 ...
- java 多线程下载 断点_Java 多线程断点下载文件
基起原根蒂根基理:哄骗URLConnection获取要下载文件的长度.头部等相干信息,并设置响应的头部信息.并且经由过程URLConnection获取输入流,将文件分成指定的块,每一块零丁开辟一个线程 ...
- java 服务器 文件写入文件_java 从服务器下载文件并保存到本地
昨天在做一个项目时,用到了从服务器上下载文件并保存到本地的知识,以前也没有接触过,昨天搞了一天,这个小功能实现了,下面就简单的说一下实现过程: 1.基础知识 当我们想要下载网站上的某个资源时,我们会获 ...
最新文章
- python财务-财务方面的学生如何学习python?
- 融合趋势下基于 Flink Kylin Hudi 湖仓一体的大数据生态体系
- 聊聊Unity项目管理的那些事:Git-flow和Unity
- PHP 函数截图 哈哈哈
- 【机器学习-数据科学】第二节:ipython开发环境搭建以及pandas快速入门
- java 记录一个类加载顺序的坑
- Appium之开发计算器自动化测试脚本Demo
- python 选择题 多线程_python多线程练习题
- MySql常用语句 转
- Oracle中的COALESCE,NVL,NVL2,NULLIF函数
- 用c#中的WebBrowser抢小米F码,抢小米手机以及自动测试实现原理
- WinRunner介绍 (不断更新)
- Python爬取全站妹子图片,差点硬盘走火了!
- 基站定位php,基于Python的移动联通基站接口调用代码实例
- NOJ1060接苹果——DP
- 今日头条2018年1月8日面试
- 安卓音视频入门难,老司机分享音视频开发学习技巧与痛点
- Excel常用公式大全
- 2023最新物联网毕业设计选题推荐100例
- ios6应用运行在ios7系统上
热门文章
- 英特尔® 至强® 平台集成 AI 加速构建数据中心智慧网络
- Java的IDEA最常用快捷键汇总+快速写出Main函数
- [C] 层层递进——C语言实现广度优先搜索
- This Gradle plugin requires a newer IDE able to request IDE model level 3.For Android Studio this
- CF332C Students' Revenge
- Android 支付宝H5 没有回调
- 遥控车_vijos1458_纪中1724_水
- 聊聊高并发(十六)实现一个简单的可重入锁
- 第十二周 11.15-11.21
- hdu 4278 2012天津赛区网络赛 数学 *