浏览器服务端文件下载控制(安全阻止、文件浏览器打开还是下载行为控制)

文章目录

简介

随着浏览器的发展,有很多安全方面的限制,对我们的文件下载行为产生了很大的影响。

JavaScript下载文件(简单模式、跨域问题、文件压缩)我们已经介绍了一些下载问题。

本篇我们将继续介绍2个问题:

  1. 文件下载安全设置
  2. 浏览器和服务端如何控制文件是下载还是打开

Chrome已阻止不安全内容下载

相信很多朋友都突然就遇到了每次下载文件都要点保留的糟心事,怎么不要每次都确认呢?

可以设置允许指定网站的不安全内容:

设置-> 隐私和安全 -> 网站设置 -> 不安全内容

PDF直接打开

Chrome对于自己支持的文件类型,访问链接的时候是直接打开,例如pdf、txt、xml、js

有很多非IT专业的业务老师可不知道可以文件另存为(ctrl+s)这种操作,只知道下载不了。或者知道另存为,但是只想下载文件,不想直接打开,还要自己另存为。

如果我们希望是下载文件而不是直接打开文件应该怎么办呢?

对于PDF类型来说,可以通过下面的方式设置:

设置-> 隐私和安全 -> 网站设置 -> 不安全内容

txt、xml、js文件被自动打开了而不是下载

Chrome针对PDF被直接打开不是下载有单独的设置,但是对于txt、xml、js文件被自动打开而不是下载了怎么处理呢?

答案是在response的header中设置Content-Disposition为attachment

后端设置:

java 复制代码
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);

浏览器看到response的Content-Disposition值为attachment,就会执行下载操作,而不是直接打开。

对于PDF来说,如果Chrome已经设置了【在Chrome中打开PDF文件】,那么就算是response的Content-Disposition值为attachment,还是会直接打开PDF文件。

阿里OSS设置response header

对于我们自己服务端好设置,但是对于像oss组件这种如何设置呢?

下面我们以阿里OSS设置来说明一下:

可以通过PutObjectRequest来设置

java 复制代码
@Test
public void uploadHeader() {
    String endpoint = "http://oss.com";
    String accessKeyId = "xxx";
    String accessKeySecret = "sssss";
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    String content = "Hello OSS";
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(content.getBytes());
    PutObjectRequest request = new PutObjectRequest(bucketName,"test/hello.txt",byteArrayInputStream);
    request.addHeader("Content-Disposition","attachment");
    ossClient.putObject(request);
}

阿里OSS修改metadata

如果文件已经上传过了,如何修改呢?

我们可以通过拷贝的方式修改metadata:

java 复制代码
@Test
public void metaHeader() {
    String endpoint = "http://oss.com";
    String accessKeyId = "xxx";
    String accessKeySecret = "sssss";
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    String objectName = "test/test030801.txt";
    CopyObjectRequest request = new CopyObjectRequest(bucketName, objectName, bucketName, objectName);
    ObjectMetadata meta = new ObjectMetadata();
    meta.setContentType("text/plain");
    meta.setContentDisposition("attachment");
    request.setNewObjectMetadata(meta);
    ossClient.copyObject(request);
}