zipparameters 使用_Java中受密码保护的zip文件 问问题

下面的示例代码将用邮政编码和密码保护您的文件。该REST服务接受原始文件的字节。它压缩字节数组,并用密码保护它。然后,它将发送受密码保护的压缩文件字节作为响应。该代码是向REST服务发送二进制字节和从REST服务接收二进制字节,以及使用密码保护压缩文件的示例。字节从流中压缩,因此服务器上没有存储任何文件。

在Java中使用Jersey API使用JAX-RS API

客户端正在使用Jersey-client API。

使用zip4j 1.3.2开源库和apache commons io。

@PUT

@Path("/bindata/protect/qparam")

@Consumes(MediaType.APPLICATION_OCTET_STREAM)

@Produces(MediaType.APPLICATION_OCTET_STREAM)

public Response zipFileUsingPassProtect(byte[] fileBytes, @QueryParam(value = "pass") String pass,

@QueryParam(value = "inputFileName") String inputFileName) {

System.out.println("====2001==== Entering zipFileUsingPassProtect");

System.out.println("fileBytes size = " + fileBytes.length);

System.out.println("password = " + pass);

System.out.println("inputFileName = " + inputFileName);

byte b[] = null;

try {

b = zipFileProtected(fileBytes, inputFileName, pass);

} catch (IOException e) {

e.printStackTrace();

return Response.status(Status.INTERNAL_SERVER_ERROR).build();

}

System.out.println(" ");

System.out.println("++++++++++++++++++++++++++++++++");

System.out.println(" ");

return Response.ok(b, MediaType.APPLICATION_OCTET_STREAM)

.header("content-disposition", "attachment; filename = " + inputFileName + ".zip").build();

}

private byte[] zipFileProtected(byte[] fileBytes, String fileName, String pass) throws IOException {

ByteArrayInputStream inputByteStream = null;

ByteArrayOutputStream outputByteStream = null;

net.lingala.zip4j.io.ZipOutputStream outputZipStream = null;

try {

//write the zip bytes to a byte array

outputByteStream = new ByteArrayOutputStream();

outputZipStream = new net.lingala.zip4j.io.ZipOutputStream(outputByteStream);

//input byte stream to read the input bytes

inputByteStream = new ByteArrayInputStream(fileBytes);

//init the zip parameters

ZipParameters zipParams = new ZipParameters();

zipParams.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);

zipParams.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);

zipParams.setEncryptFiles(true);

zipParams.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);

zipParams.setPassword(pass);

zipParams.setSourceExternalStream(true);

zipParams.setFileNameInZip(fileName);

//create zip entry

outputZipStream.putNextEntry(new File(fileName), zipParams);

IOUtils.copy(inputByteStream, outputZipStream);

outputZipStream.closeEntry();

//finish up

outputZipStream.finish();

IOUtils.closeQuietly(inputByteStream);

IOUtils.closeQuietly(outputByteStream);

IOUtils.closeQuietly(outputZipStream);

return outputByteStream.toByteArray();

} catch (ZipException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

IOUtils.closeQuietly(inputByteStream);

IOUtils.closeQuietly(outputByteStream);

IOUtils.closeQuietly(outputZipStream);

}

return null;

}

单元测试如下:

@Test

public void testPassProtectZip_with_params() {

byte[] inputBytes = null;

try {

inputBytes = FileUtils.readFileToByteArray(new File(inputFilePath));

} catch (IOException e) {

e.printStackTrace();

}

System.out.println("bytes read into array. size = " + inputBytes.length);

Client client = ClientBuilder.newClient();

WebTarget target = client.target("http://localhost:8080").path("filezip/services/zip/bindata/protect/qparam");

target = target.queryParam("pass", "mypass123");

target = target.queryParam("inputFileName", "any_name_here.pdf");

Invocation.Builder builder = target.request(MediaType.APPLICATION_OCTET_STREAM);

Response resp = builder.put(Entity.entity(inputBytes, MediaType.APPLICATION_OCTET_STREAM));

System.out.println("response = " + resp.getStatus());

Assert.assertEquals(Status.OK.getStatusCode(), resp.getStatus());

byte[] zipBytes = resp.readEntity(byte[].class);

try {

FileUtils.writeByteArrayToFile(new File(responseFilePathPasswordZipParam), zipBytes);

} catch (IOException e) {

e.printStackTrace();

}

}

随时使用和修改。如果发现任何错误,请告诉我。希望这可以帮助。

编辑1-使用QueryParam,但您可以将HeaderParam用于PUT来将passwd隐藏起来。相应地修改测试方法。

编辑2-REST路径为filezip / services / zip / bindata / protect / qparam

filezip是战争的名称。services是web.xml中的url映射。zip是类级别的路径注释。bindata / protect / qparam是方法级别的路径注释。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值