简介
随着浏览器的发展,有很多安全方面的限制,对我们的文件下载行为产生了很大的影响。
在JavaScript下载文件(简单模式、跨域问题、文件压缩)我们已经介绍了一些下载问题。
本篇我们将继续介绍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
后端设置:
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来设置
@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:
@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);
}