Java上传下载文件并实现加密解密
使用Jersey服务器实现上传,使用HTTP请求实现下载
引入依赖
在pom.xml中添加Jersey相关依赖
com.sun.jersey jersey-client 1.18.1
创建工具类
importcom.sun.jersey.api.client.Client;
importcom.sun.jersey.api.client.ClientHandlerException;
importcom.sun.jersey.api.client.UniformInterfaceException;
importcom.sun.jersey.api.client.WebResource;
importorg.springframework.web.context.request.RequestContextHolder;
importorg.springframework.web.context.request.ServletRequestAttributes;
importorg.springframework.web.multipart.MultipartFile;
importjavax.servlet.http.HttpServletRequest;
importjava.io.*;
importjava.net.HttpURLConnection;
importjava.net.URL;
importjava.util.UUID;
publicclassFileUtils{
//加密/解密文件的密钥
publicstaticfinalintCRYPTO_SECRET_KEY=0x99;
publicstaticintFILE_DATA=0;
/**
*加密/解密文件
*@paramsrcFile原文件
*@paramencFile加密/解密后的文件
*@throwsException
*/
publicstaticvoidcryptoFile(FilesrcFile,FileencFile)throwsException{
InputStreaminputStream=newFileInputStream(srcFile);
OutputStreamoutputStream=newFileOutputStream(encFile);
while((FILE_DATA=inputStream.read())>-1){
outputStream.write(FILE_DATA^CRYPTO_SECRET_KEY);
}
inputStream.close();
outputStream.flush();
outputStream.close();
}
/**
*MultipartFile生成临时文件
*@parammultipartFile
*@paramtempFilePath临时文件路径
*@returnFile临时文件
*/
publicstaticFilemultipartFileToFile(MultipartFilemultipartFile,StringtempFilePath){
Filefile=newFile(tempFilePath);
//获取文件原名
StringoriginalFilename=multipartFile.getOriginalFilename();
//获取文件后缀
Stringsuffix=originalFilename.substring(originalFilename.lastIndexOf("."));
if(!file.exists()){
file.mkdirs();
}
//创建临时文件
FiletempFile=newFile(tempFilePath+"\\"+UUID.randomUUID().toString().replaceAll("-","")+suffix);
try{
if(!tempFile.exists()){
//写入临时文件
multipartFile.transferTo(tempFile);
}
}catch(IOExceptione){
e.printStackTrace();
}
returntempFile;
}
/**
*上传文件
*@paramfileServerPath 文件服务器地址
*@paramfolderPath存放的文件夹路径(比如存放在文件服务器的upload文件夹下,即”/upload“)
*@paramuploadFile 需要上传的文件
*@paramisCrypto 是否加密
*@returnString 文件上传后的全路径
*/
publicstaticStringuploadByJersey(StringfileServerPath,StringfolderPath,FileuploadFile,booleanisCrypto){
Stringsuffix=uploadFile.getName().substring(uploadFile.getName().lastIndexOf("."));
StringrandomFileName=UUID.randomUUID().toString().replaceAll("-","")+suffix;
StringfullPath=fileServerPath+folderPath+"/"+randomFileName;
try{
if(isCrypto){
//创建加密文件
FilecryptoFile=newFile(uploadFile.getPath().substring(0,uploadFile.getPath().lastIndexOf("."))+"crypto"+uploadFile.getPath().substring(uploadFile.getPath().lastIndexOf(".")));
//执行加密
cryptoFile(uploadFile,cryptoFile);
//保存加密后的文件
uploadFile=cryptoFile;
}
//创建Jersey服务器
Clientclient=Client.create();
WebResourcewr=client.resource(fullPath);
//上传文件
wr.put(String.class,fileToByte(uploadFile));
}catch(Exceptione){
e.printStackTrace();
}
returnfullPath;
}
/**
*下载文件
*@paramurl文件路径
*@paramfilePath文件保存路径
*@paramfileName 文件名称(包含文件后缀)
*@paramisCrypto是否解密
*@returnFile
*/
publicstaticFiledownloadByURL(Stringurl,StringfilePath,StringfileName,booleanisCrypto){
Filefile=newFile(filePath);
if(!file.exists()){
file.mkdirs();
}
FileOutputStreamfileOut;
HttpURLConnectionhttpURLConnection;
InputStreaminputStream;
try{
URLhttpUrl=newURL(url);
httpURLConnection=(HttpURLConnection)httpUrl.openConnection();
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);
httpURLConnection.setUseCaches(false);
httpURLConnection.connect();
inputStream=httpURLConnection.getInputStream();
BufferedInputStreambufferedInputStream=newBufferedInputStream(inputStream);
if(!filePath.endsWith("\\")){
filePath+="\\";
}
file=newFile(filePath+fileName);
fileOut=newFileOutputStream(file);
BufferedOutputStreambufferedOutputStream=newBufferedOutputStream(fileOut);
byte[]bytes=newbyte[4096];
intlength=bufferedInputStream.read(bytes);
//保存文件
while(length!=-1){
bufferedOutputStream.write(bytes,0,length);
length=bufferedInputStream.read(bytes);
}
bufferedOutputStream.close();
bufferedInputStream.close();
httpURLConnection.disconnect();
}catch(Exceptione){
e.printStackTrace();
}
if(isCrypto){
try{
//创建解密文件
FilecryptoFile=newFile(((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(Exceptione){
e.printStackTrace();
}
}
returnfile;
}
/**
*删除文件服务器上的文件
*@paramurl文件路径
*@returnboolean
*/
publicstaticbooleandeleteByJersey(Stringurl){
try{
Clientclient=newClient();
WebResourcewebResource=client.resource(url);
webResource.delete();
returntrue;
}catch(UniformInterfaceExceptione){
e.printStackTrace();
}catch(ClientHandlerExceptione){
e.printStackTrace();
}
returnfalse;
}
/**
*File转Bytes
*@paramfile
*@returnbyte[]
*/
publicstaticbyte[]fileToByte(Filefile){
byte[]buffer=null;
try{
FileInputStreamfileInputStream=newFileInputStream(file);
ByteArrayOutputStreambyteArrayOutputStream=newByteArrayOutputStream();
byte[]bytes=newbyte[1024];
intn;
while((n=fileInputStream.read(bytes))!=-1){
byteArrayOutputStream.write(bytes,0,n);
}
fileInputStream.close();
byteArrayOutputStream.close();
buffer=byteArrayOutputStream.toByteArray();
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnbuffer;
}
}
测试上传
/**
*@parammultipartFile上传文件
*@paramisCrypto是否加密文件
*@return
*/
@Test
publicStringupload(MultipartFilemultipartFile,booleanisCrypto){
HttpServletRequestrequest=((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
//生成临时文件
FiletempFile=FileUtil.multipartFileToFile(multipartFile,request.getServletContext().getRealPath("/")+"\\static\\temp");
//上传文件并返回文件路径
StringuploadFilePath=FileUtil.uploadByJersey("http://localhost:8080","/upload",tempFile,isCrypto);
if(uploadFilePath!=null){
return"上传成功";
}
else{
return"上传失败";
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。