java后台简单从阿里云上传下载文件并通知前端以附件的形式保存
一、 首先开通阿里的OSS 服务 创建一个存储空间在新建一个Bucket 在你新建的bucket有所需的id和key

获取外网访问地址或者是内网 看个人需求 我使用的是外网(内网没用过 估计是部署到阿里云服务器可以使用内网) 获取endpoint

好了前期准备工作完事
以下是我项目的机构

pom 配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.</modelVersion> <groupId>xudy.top</groupId>
<artifactId>OssAction</artifactId>
<version>1.0-SNAPSHOT</version> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5..RELEASE</version>
<relativePath/>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.7.</version>
</dependency> </dependencies> </project>
ConfigUtols 配置代码
@Component
public class ConfigUtils { /**
* 腾讯云配置
* @return
*/
@Bean
public OSSClient getCOSClient() {
return this.getOSSClient();
} /**
* 阿里云OSS对象存储 客户端
* @return
*/
public static OSSClient getOSSClient() {
String endpoint = "http://os.com";
String accessKeyId = "LTadAI";
String accessKeySecret = "zLIRj001";
// 创建OSSClient实例
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
return ossClient;
} }
Controller 里包含 上传 和下载代码:
@RestController
public class MainController { @Autowired
OSSClient ossClient; @GetMapping(value = "/upload")
public String OSSUpLoad(){ // 上传byte数组
// byte[] content = "Hello OSS xudy".getBytes();
// ossClient.putObject("xudy", "xudy", new ByteArrayInputStream(content)); String filePath = System.getProperty("user.dir") + File.separator + "file" + File.separator + "top.jpg";
// 上传文件流
try {
File file = new File(filePath);
InputStream inputStream = new FileInputStream(file); // 上传文件
ossClient.putObject("xudy", "txt.jpg", inputStream);
} catch (Exception e) {
// e.printStackTrace();
System.out.println("上传阿里云OSS服务器异常." + e.getMessage()); }
// 关闭client 正常开发的时候 做好把下面代码屏蔽
// ossClient.shutdown(); return "upload";
} @GetMapping(value = "/download")
public void OssAction(HttpServletRequest request, HttpServletResponse response){
try {
String fileName="txt.jpg";
String ossKey="txt.jpg";
// 从阿里云进行下载
OSSObject ossObject = ossClient.getObject("xudy",ossKey);//bucketName需要自己设置
// 已缓冲的方式从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取
BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent())); InputStream inputStream = ossObject.getObjectContent(); //缓冲文件输出流
BufferedOutputStream outputStream=new BufferedOutputStream(response.getOutputStream());
//通知浏览器以附件形式下载
// response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
// 为防止 文件名出现乱码
response.setContentType("application/doc");
final String userAgent = request.getHeader("USER-AGENT");
if(StringUtils.contains(userAgent, "MSIE")){//IE浏览器
fileName = URLEncoder.encode(fileName,"UTF-8");
}else if(StringUtils.contains(userAgent, "Mozilla")){//google,火狐浏览器
fileName = new String(fileName.getBytes(), "ISO8859-1");
}else{
fileName = URLEncoder.encode(fileName,"UTF-8");//其他浏览器
}
response.addHeader("Content-Disposition", "attachment;filename=" +fileName);//这里设置一下让浏览器弹出下载提示框,而不是直接在浏览器中打开
// 进行解码 如果上传时为了防止乱码 进行解码使用此方法
BASE64Decoder base64Decoder = new BASE64Decoder();
// byte[] car;
// while (true) {
// String line = reader.readLine();
// if (line == null) break;
// car = base64Decoder.decodeBuffer(line);
//
// outputStream.write(car);
// }
// reader.close();
byte[] car = new byte[1024];
int L;
while((L = inputStream.read(car)) != -1){
if (car.length!=0){
outputStream.write(car, 0,L);
}
}
if(outputStream!=null){
outputStream.flush();
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
} catch (OSSException e){
}
}
/**
* 删除存储空间buckName
*/
public void deleteBucket(){
ossClient.deleteBucket("");
}
注意:在实际使用该方法下载的过程中,可能遇到服务器不报错,但就是下载不下来文件的问题,这样有可能是前端页面发出下载请求的方式有误,不能使用AJAX的get方式访问该方法,因为Ajax能够返回的数据格式只能为html,script,json,xml,不接受流的形式。笔者使用的方式是用window.location.href访问,或者使用from表单提交方式(GET/POST)。
源码:git@gitee.com:xdymemory00/OssDownLoad.git
借鉴来源:https://www.alibabacloud.com/help/zh/doc-detail/32014.htm
java后台简单从阿里云上传下载文件并通知前端以附件的形式保存的更多相关文章
- java后台简单从腾讯云下载文件通知前端以附件的形式保存
腾讯云对象存储和阿里云差不多 这是我的配置 /** * 腾讯云client * @return COSClient */ public static COSClient getCOSClient() ...
- vue 阿里云上传组件
vue 阿里云上传组件 Vue.js上传图片到阿里云OSS存储 测试项目git地址 本测试项目启动方法 示例链接 组件配置项 实践解释 本文主要介绍如何 在vue项目中使用web 直传方式上传阿里云o ...
- 如何利用京东云的对象存储(OSS)上传下载文件
作者:刘冀 在公有云厂商里都有对象存储,京东云也不例外,而且也兼容S3的标准因此可以利用相关的工具去上传下载文件,本文主要记录一下利用CloudBerry Explorer for Amazon S3 ...
- java web service 上传下载文件
1.新建动态web工程youmeFileServer,新建包com,里面新建类FileProgress package com; import java.io.FileInputStream; imp ...
- 【转】Java IOUtils方式上传下载文件 on HDFS
[From]https://www.cnblogs.com/areyouready/p/9795442.html package com.css.hdfs04; import java.io.File ...
- Linux系统简单易用的上传下载命令rz和sz
一)安装方法汇总 1.安装方法(推荐) yum install lrzsz -y 2.在安装Linux系统时选中"DialupNetworking Support"组包 3.安装系 ...
- 向linux服务器上传下载文件方式收集
向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ...
- Jmeter 上传下载文件
最近很多同学都在问jmeter上传.下载文件的脚本怎么做,要压测上传.下载文件的功能,脚本怎么做,网上查了都说的很含糊,这次呢,咱们就好好的把jmeter的上传下载文件好好缕缕,都整明白了,怎么个过程 ...
- 在Windows上使用终端模拟程序连接操作Linux以及上传下载文件
在Windows上使用终端模拟程序连接操作Linux以及上传下载文件 [很简单,就是一个工具的使用而已,放这里是做个笔记.] 刚买的云主机,或者是虚拟机里安装的Linux系统,可能会涉及到在windo ...
随机推荐
- 数论知识总结——史诗大作(这是一个flag)
1.快速幂 计算a^b的快速算法,例如,3^5,我们把5写成二进制101,3^5=3^1*1+3^2*2+3^4*1 ll fast(ll a,ll b){ll ans=;,a=mul(a,a)))a ...
- 127. Word Ladder (Tree, Queue; WFS)
Given two words (beginWord and endWord), and a dictionary's word list, find the length of shortest t ...
- placement new
placement new就是把原本new做的两步工作分开来.第一步你自己分配内存,第二步你调用类的构造函数在自己分配的内存上构建新的对象. class Foo { float f; public: ...
- bootstrop-datatime参数配置
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- (转)Java 中关于String的空对象(null) ,空值(empty),空格
原文出处:Java 中关于String的空对象(null) ,空值(empty),空格 定义 空对象: String s = null; 空对象是指定义一个对象s,但是没有给该对象分配空间,即没有实例 ...
- MicroRNA in Control of Gene Expression: An Overview of Nuclear Functions 微RNA控制基因表达:核功能概述
MicroRNA in Control of Gene Expression:An Overview of Nuclear Functions微RNA控制基因表达:核功能概述 抽象:小的非编码RNA( ...
- 分布式理论系列(一)从 ACID 到 CAP 到 BASE
分布式理论系列(一)从 ACID 到 CAP 到 BASE 一.ACID 1.1 事务的四个特征: (1) Atomic(原子性) 事务必须是一个原子的操作序列单元,事务中包含的各项操作在一次执行过程 ...
- C#进阶系列——WebApi 异常处理解决方案(转)
出处:http://www.cnblogs.com/landeanfen/p/5363846.html 阅读目录 一.使用异常筛选器捕获所有异常 二.HttpResponseException自定义异 ...
- LightOJ 1428 Melody Comparison (KMP + 后缀数组)
题意:给定两个串A,B,问你A有多少不同的子串,并且不包含B. 析:首先A有多少个不同的子串,可以用后缀数组来解决,也就是 n - sa[i] - h[i] + 1.但是要是不包含B,可以先预处理A和 ...
- C++继承-重载-多态-虚函数
C++ 继承 基类 & 派生类 一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数.定义一个派生类,我们使用一个类派生列表来指定基类.类派生列表以一个或多个基类命名,形式如下: ...