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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。