Spring Mvc 文件上传-下载
1、导入依赖
<!-- 文件上传的jar依赖-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
2、在sprig-mvc.mxl文件中定义,文件上传解析器
<!-- 配置文件上传-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/> <!-- 指定文件上传的默认编码 -->
<property name="maxInMemorySize" value="2097152"/> <!--占用内存最大值-->
<property name="maxUploadSize" value="52428800"/><!--最大文件上传大小-->
</bean>
3、定义表单,并跳转到controller,指定文件上传的方法上
<form action="pages/insert" method= "post" enctype= "multipart/form-data">
消息类型: <input type="text" id= "title" name= "title" value=""/>
上传照片: <input type= "file" id= "pic" name= "pic"/><br>
<input type="submit" value="提交">
<input type="reset" value="重 置"><
</form>
4、方式一:在controller控制器中,需要在文件上传的方法中使用这个接口,MultipartFile;此接口为CommonsMultipartFile类的父类
@RequestMapping("方法的访问路径") //当表单跳根据路径跳转到此方法时MultipartFile对象将接收文件数据,
public ModelAndView insert (Type type, MultipartFile pic) {
System. out. println(" [类型名称] " + type.getTitle());
System. out . println(" [文件类型] " + pic. getContentType()) ;
System. out. println(" [文件大小]"+ pic.getSize());
System. out . println(" [是否为空] " + pic. isEmpty());
System. out . println(" [数据流]"+ pic. getInputStream());
System. out . println(" [文件全名(包含后缀)]"+ pic. getOriginalFilename());
//指定上传路径
File file = new File("D:/upload/");
// 遍历uploadfiles数组,取出单个文件对象,并上传
for (MultipartFile multipartFile : uploadfiles) {
//指定上传后的文件的全名称
String newFileName = UUID.randomUUID() + multipartFile.getOriginalFilename();
//文件上传:将文件放到指定的路径下
multipartFile.transferTo(new File(file, newFileName));
}
return null; //返回null表示不跳转
}
在使用外置的tomcat时,可以利用HttpServletRequest对象获取项目运行部署路径下的upload文件夹路径。
//注意:SpringBoot 不适用此方法获取项目部署路径,因为SpringBoot集成了tomcat,不是使用的本地的tomcat
String realPath = req.getSession().getServletContext().getRealPath("/upload");
CommonsMultipartFile常用方法
org. springframework web.multipart.commons. CommonsMultipartFile
// a. 取得上传文件的MIME类型:
public String getContentType();
// b. 判断是否有上传文件:
public boolean isEmpty();。
// c. 取得上传文件的长度:
public long getSize();。
// d. 取得上传文件的输入流:
public InputStream getInputream()
// e. 取得上传文件的全名称:
public String getOriginalFilename()
5、方式二:使用HttpServletRequest上传文件
// 文件上传,并返回上传后的图片路径,根据HttpServletRequest,删除文件
public String getFileUploadName(HttpServletRequest req) {
// 获取项目运行部署路径下的upload文件夹路径
String realPath = req.getSession().getServletContext().getRealPath("/upload");
MultipartHttpServletRequest mf = (MultipartHttpServletRequest) req;
// 根据《input type=”file” id=”file”》,《input type=”file” id=”file2”》,《input type=”file” id=”file3”》id获取文件对象
CommonsMultipartFile file1 = (CommonsMultipartFile) mf.getFile("file");
CommonsMultipartFile file2 = (CommonsMultipartFile) mf.getFile("file2");
CommonsMultipartFile file3 = (CommonsMultipartFile) mf.getFile("file3");
// 随机生成文件名
String filename1 = UUID.randomUUID().toString().replaceAll("-", "") +
file1.getOriginalFilename().substring(file1.getOriginalFilename().lastIndexOf(
"."));
String filename2 = UUID.randomUUID().toString().replaceAll("-", "") +
file2.getOriginalFilename().substring(file2.getOriginalFilename().lastIndexOf(
"."));
String filename3 = UUID.randomUUID().toString().replaceAll("-", "") +
file3.getOriginalFilename().substring(file3.getOriginalFilename().lastIndexOf(
"."));
// 在upload文件下创建当天日期的文件夹
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String ds = format.format(date);
File realDir = new File(realPath + "/" + ds);
// 如果没有这个文件夹,则创建文件夹
if (!realDir.exists()) {
realDir.mkdirs();
}
// 指定图片存放的路径
String path1 = realPath + "/" + ds + "/" + filename1;
String path2 = realPath + "/" + ds + "/" + filename2;
String path3 = realPath + "/" + ds + "/" + filename3;
// 创建文件夹,并将图片上传到指定路径
File f1 = new File(path1);
try {
FileUtils.copyInputStreamToFile(file1.getInputStream(), f1);
} catch (IOException e) {
e.printStackTrace();
}
File f2 = new File(path2);
try {
FileUtils.copyInputStreamToFile(file2.getInputStream(), f2);
} catch (IOException e) {
e.printStackTrace();
}
File f3 = new File(path3);
try {
FileUtils.copyInputStreamToFile(file3.getInputStream(), f3);
} catch (IOException e) {
e.printStackTrace();
}
// 将上传的三个图片用逗号分隔,组合成字符串
String mimg = ds + "/" + filename1 + "," + ds + "/" + filename2 + "," + ds + "/" +
filename3;
return mimg;
}
6、文件下载
@Value("${img.rootpath}") // 获取配置文件中定义的文件保存路径
private String rootPath;
/*根据请求字符串中携带的文件名.后缀,以及在properties文件中定义的img.rootpath 指定的文件下载路径,将指定的文件输出到浏览器中
(默认这个操作是下载操作,浏览器会自动下载到本地,如果文件流输出的目标为img标签或者其他的图片载体标签的话,则会直接在页面上面进行显示)*/
@RequestMapping("image/**") // 假设发出的请求为 http://localhost:8088/image/oasys.jpg
public void image(HttpServletResponse response, HttpServletRequest request) throws Exception {
/*获取请求中的,请求字符串携带的信息(/image/文件名.后缀) 、 获取到的是 “/image/oasys.jpg” */
String startpath = new String(URLDecoder.decode(request.getRequestURI(), "utf-8"));
/*截取文件名.后缀,将startpath中多余的内容变为空格、 获取到的是“/oasys.jpg” */
String path = startpath.replace("/image", "");
/*rootPath:图片保存的文件夹路径,path:文件名.后缀 */
File f = new File(rootPath, path);
/*获取输出流对象*/
ServletOutputStream sos = response.getOutputStream();
/*将文件放入到输出流中,准备输出到指定位置*/
FileInputStream input = new FileInputStream(f.getPath());
/*返回指定文件的byte字节长度。*/
byte[] data = new byte[(int) f.length()];
/* 将输出流,与文件长度放入,这个方法会读取指定长度的流,并输出,如果读取的长度不够,就会抛出异常 */
IOUtils.readFully(input, data);
// 将文件流输出到浏览器
IOUtils.write(data, sos);
input.close();
sos.close();
}
文件上传注意事项
上传文件时如何获取文件上传的目的地路?为什么需要这个路径?
public String getFileUploadName(HttpServletRequest req) {
String realPath =
req.getSession().getServletContext().getRealPath("/upload");
}
/**为什么获取这个路径
因为,这个获取的是项目的运行的部署路径,如果指定一个固定的地址,项目在另外了一个地方进行部署后,则不能进行获取图片的路径了**/
注意:springboot不能使用上述方法,获取项目的运行部署路径,因为springboot是内嵌式tomcat,每次启动tomcat的部署路径都不同,此方法只适用于外置的tomcat。
上传时为什么要生成一个随机文件名?如何生成?
- 如果不生成随机的文件名,在上传文件时可以上传同名文件,这样会导致其他的文件被覆盖
- 使用java中
UUID.randomUUID()
方法获取16字符串的随机字符串
System.currentTimeMillis()
获取系统当前时间的毫秒数
图片上传到本地服务器中,有什么缺点?
- 只能在本地服务器中使用,其他服务器不能进行访问
- 如果本地服务器出现了故障,则会导致数据的丢失,造成严重的后果
OSS对象存储
![]() | 签名后直传![]() |
导入依赖
<!-- OSS文件系统-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<!-- 下面的两个依赖可能和springboot的日志依赖有冲突,选用 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>com.aliyun.oas</groupId>
<artifactId>aliyun-oas</artifactId>
<version>0.2.5</version>
</dependency>
<!-- 文件上传jar包 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
OSS工具类
普通上传工具类
基础oss工具类
package gmail.zxm.dubboz1jdglweb.oss;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 阿里云oss连接工具类
*/
public class OSSUtil {
private static String ENDPOINT = "oss-cn-beijing.aliyuncs.com"; // 外网访问连接地址
private static String ACCESSKEY_ID = "LTAI4G1wZYN8j4mEFxHH63x9"; // ACCESSKEY ID
private static String ACCESSKEY_SECRET = "bUqAG9FWXHyNXPP5JjS3QxWrTJ8Bg1"; // ACCESSKEY 密码
private static String BUKET_NAME = "youzxm123"; // 仓库名称
private static String SUFFER_URL = "http://youzxm.oss-cn-beijing.aliyuncs.com/"; // 上传成功图片访问url的前缀, http://仓库名.外网连接地址
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_ss"); // 日期格式化
/**
* 创建oss连接
*
* @return 返回连接对象
*/
private static OSS getOssClient() throws Exception {
OSS oss = new OSSClientBuilder().build(ENDPOINT, ACCESSKEY_ID, ACCESSKEY_SECRET);
if (oss.doesBucketExist(BUKET_NAME)) {
System.out.println("连接成功");
} else {
System.out.println("bucket不存在,创建bucket仓库");
CreateBucketRequest createBucketRequest = new CreateBucketRequest(null); // 创建bucket仓库请求
createBucketRequest.setBucketName(BUKET_NAME); // 设置仓库的名称
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead); // 设置仓库的权限为公共读
oss.createBucket(createBucketRequest); // 创建仓库
}
return oss;
}
/**
* 上传指定的文件
* @param file 文件
* @param fileType 文件类型
* @return 返回访问的url地址
*/
public static String uploadDocument(MultipartFile file, String fileType){
OSS oss = null;
// 上传成功后,访问的url:url前缀 + 文件名 进行访问
String url = null;
try {
// 获取oss连接
oss = getOssClient();
// 获取上传文件的后缀名
// String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
// 判断文件类型是否为null为null的话,则赋值为default
if (fileType == null) {
fileType = "default";
}
// 拼接文件名称
String fileName = "images/" + sdf.format(new Date()) + "_" + fileType + "_" + file.getOriginalFilename();
// 文件上传
oss.putObject(BUKET_NAME, fileName, new ByteArrayInputStream(file.getBytes()));
// 拼接返回图片的url
url = SUFFER_URL + fileName;
System.out.println("图片访问地址:" + url);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭连接
if (oss != null)
oss.shutdown();
}
// 返回url
return url;
}
/**
* 删除指定库中的指定文件
* @param imgName
* @throws Exception
*/
public static boolean deleteDocument(String imgName) {
OSS oss = null;
try {
oss = getOssClient();
oss.deleteObject(BUKET_NAME, imgName);
} catch (Exception e) {
e.printStackTrace();
}finally {
if (oss != null)
oss.shutdown();
}
return true;
}
/**
* 根据文件名删除指定文件,并上传指定的文件
* @param file 新文件
* @param fileType 新文件的类型
* @param imgName 旧文件名
* @return
*/
public static String updateDocument(MultipartFile file , String fileType,String imgName){
OSS oss = null;
String url = null;
try {
// 获取连接对象
oss = getOssClient();
// 根据文件名删除文件对象
oss.deleteObject(BUKET_NAME,imgName);
// 判断是否为null,为null则设置默认值
if (fileType == null)
fileType = "default";
// 判断文件是否为null,不为null,添加新文件
if (!file.isEmpty()){
String fileName = "images/" + sdf.format(new Date()) + "_" + fileType + "_" + file.getOriginalFilename();
oss.putObject(BUKET_NAME,fileName, new ByteArrayInputStream(file.getBytes()));
// 拼接返回图片的url
url = SUFFER_URL + fileName;
System.out.println("图片访问地址:" + url);
}
}catch (Exception e){
e.printStackTrace();
}finally {
// 判断连接对象是否为null,不为null,关闭连接
if (oss != null)
oss.shutdown();
}
// 返回访问的url地址
return url;
}
}
功能比较齐全的oss工具类
package cn.mldn.lxh.xmz.common.oss;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.internal.OSSHeaders;
import com.aliyun.oss.model.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
* oss对象存储上传工具类
*/
public class AliyunOssUtils {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
private String folder;
private String webUrl;
public FileResult upload(File file) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = format.format(new Date());
if (null == file) {
return null;
}
String suffix = file.getName().substring(file.getName().lastIndexOf(".") + 1);
PutObjectResult result = null;
try {
//容器不存在,就创建
/*if(!ossClient.doesBucketExist(bucketName)){
ossClient.createBucket(bucketName);
CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
ossClient.createBucket(createBucketRequest);
}*/
//khkhwkhkhk12h3k1h3k13k1h3k1h-abc.jpg
//创建文件路径
String fileUrl =
folder + "/" + (dateStr + "/" + UUID.randomUUID().toString().replace("-", "") + "-" + file.getName());
result = uploadFileOSS(file, fileUrl);
if (null != result) {
FileResult fileResult = new FileResult(
file.length(),//文件大小
fileUrl,//文件的绝对路径
webUrl + "/" + fileUrl,//文件的web访问地址
suffix,//文件后缀
bucketName,//存储的bucket
file.getName(),//原文件名
folder//存储的文件夹
);
return fileResult;
}
} catch (OSSException oe) {
oe.printStackTrace();
} catch (ClientException ce) {
ce.printStackTrace();
} finally {
//关闭
// ossClient.shutdown();
}
return null;
}
public String getcontentType(String FilenameExtension) {
if (FilenameExtension.equalsIgnoreCase(".bmp")) {
return "image/bmp";
}
if (FilenameExtension.equalsIgnoreCase(".gif")) {
return "image/gif";
}
if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
FilenameExtension.equalsIgnoreCase(".jpg") ||
FilenameExtension.equalsIgnoreCase(".png")) {
return "image/jpeg";
}
if (FilenameExtension.equalsIgnoreCase(".html")) {
return "text/html";
}
if (FilenameExtension.equalsIgnoreCase(".txt")) {
return "text/plain";
}
if (FilenameExtension.equalsIgnoreCase(".vsd")) {
return "application/vnd.visio";
}
if (FilenameExtension.equalsIgnoreCase(".pptx") ||
FilenameExtension.equalsIgnoreCase(".ppt")) {
return "application/vnd.ms-powerpoint";
}
if (FilenameExtension.equalsIgnoreCase(".docx") ||
FilenameExtension.equalsIgnoreCase(".doc")) {
return "application/msword";
}
if (FilenameExtension.equalsIgnoreCase(".xml")) {
return "text/xml";
}
return "image/jpeg";
}
/**
* 上传图片
*
* @param file
* @return
*/
public FileResult upload(MultipartFile file) {
FileResult fileResult = null;
if (file.getSize() > 1024 * 1024 * 20) {
//return "图片太大";//RestResultGenerator.createErrorResult(ResponseEnum.PHOTO_TOO_MAX);
}
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = format.format(new Date());
String originalFilename = file.getOriginalFilename();
String suffix = file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase();
//创建文件路径
String fileUrl = folder + "/" + (dateStr + "/" + UUID.randomUUID().toString().replace("-", "") +
"-" + originalFilename);
PutObjectResult result = null;
try {
result = uploadFileOSS(file.getInputStream(), fileUrl);
if (result != null) {
fileResult = new FileResult(
file.getSize(),//文件大小
fileUrl,//文件的绝对路径
webUrl + "/" + fileUrl,//文件的web访问地址
suffix,//文件后缀
bucketName,//存储的bucket
file.getName(),//原文件名
folder//存储的文件夹
);
fileResult.setResult(result);
}
} catch (Exception e) {
e.printStackTrace();
}
return fileResult;
}
/**
* 上传图片
*
* @param files
* @return
*/
public FileResult upload(List<MultipartFile> files) {
String imgsPath = "";
String imgsWebUrl = "";
FileResult fileResult = null;
if (files != null && files.size() > 0) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = format.format(new Date());
fileResult = new FileResult(
null,//文件大小
null,//文件的绝对路径
null,//文件的web访问地址
null,//文件后缀
bucketName,//存储的bucket
null,//原文件名
folder//存储的文件夹
);
for (int i = 0; i < files.size(); i++) {
MultipartFile file = files.get(i);
String originalFilename = file.getOriginalFilename();
String suffix = file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase();
//创建文件路径
String fileUrl = folder + "/" + (dateStr + "/" + UUID.randomUUID().toString().replace("-",
"") + "-" + originalFilename);
PutObjectResult result = null;
try {
result = uploadFileOSS(file.getInputStream(), fileUrl);
if (result != null) {
imgsPath += (i == 0 ? "" : ",") + fileUrl;
imgsWebUrl += (i == 0 ? "" : ",") + webUrl + "/" + fileUrl;
}
} catch (Exception e) {
e.printStackTrace();
}
}
fileResult.setFileAPUrl(imgsPath);
fileResult.setWebUrl(imgsWebUrl);
}
return fileResult;
}
/**
* 上传图片获取fileUrl
*
* @param instream
* @param fileName
* @return
*/
private PutObjectResult uploadFileOSS(InputStream instream, String fileName) {
PutObjectResult result = null;
try {
// 如果需要上传时设置存储类型与访问权限,请参考以下示例代码。
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(instream.available());
objectMetadata.setCacheControl("no-cache");
objectMetadata.setHeader("Pragma", "no-cache");
objectMetadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
objectMetadata.setObjectAcl(CannedAccessControlList.PublicRead);
objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
objectMetadata.setContentDisposition("inline;filename=" + fileName.substring(fileName.lastIndexOf("/") + 1));
//上传文件
//设置权限 这里是公开读
//ossClient.setBucketAcl(bucketName,CannedAccessControlList.PublicRead);
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, instream,
objectMetadata);
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件
result = ossClient.putObject(putObjectRequest);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (instream != null) {
instream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
/*if(ossClient != null){
ossClient.shutdown();
}*/
}
return result;
}
/**
* 上传图片获取fileUrl
*
* @param file
* @param fileName
* @return
*/
private PutObjectResult uploadFileOSS(File file, String fileName) {
PutObjectResult result = null;
try {
// 如果需要上传时设置存储类型与访问权限,请参考以下示例代码。
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(file.length());
objectMetadata.setCacheControl("no-cache");
objectMetadata.setHeader("Pragma", "no-cache");
objectMetadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
objectMetadata.setObjectAcl(CannedAccessControlList.PublicRead);
objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
objectMetadata.setContentDisposition("inline;filename=" + fileName.substring(fileName.lastIndexOf("/") + 1));
//上传文件
//设置权限 这里是公开读
//ossClient.setBucketAcl(bucketName,CannedAccessControlList.PublicRead);
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, file,
objectMetadata);
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件。
result = ossClient.putObject(putObjectRequest);
} catch (Exception e) {
e.printStackTrace();
} finally {
/*if(ossClient != null){
ossClient.shutdown();
}*/
}
return result;
}
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
public void setAccessKeySecret(String accessKeySecret) {
this.accessKeySecret = accessKeySecret;
}
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
public void setFolder(String folder) {
this.folder = folder;
}
public void setWebUrl(String webUrl) {
this.webUrl = webUrl;
}
}
oss对象存储响应工具类
package cn.mldn.lxh.xmz.common.oss;
import com.aliyun.oss.model.PutObjectResult;
/**
* oss对象存储响应工具类
*/
public class FileResult implements java.io.Serializable {
/**
* 文件大小
*/
private Long fileSize;
/**
* 文件的绝对路径
*/
private String fileAPUrl;
/**
* 文件的web访问地址
*/
private String webUrl;
/**
* 文件后缀
*/
private String fileSuffix;
/**
* 存储的bucket
*/
private String fileBucket;
/**
* 原文件名
*/
private String oldFileName;
/**
* 存储的文件夹
*/
private String folder;
/*
上传文件后oss的响应对象
*/
PutObjectResult result;
public FileResult(Long fileSize, String fileAPUrl, String webUrl, String fileSuffix, String fileBucket,
String oldFileName, String folder) {
this.fileSize = fileSize;
this.fileAPUrl = fileAPUrl;
this.webUrl = webUrl;
this.fileSuffix = fileSuffix;
this.fileBucket = fileBucket;
this.oldFileName = oldFileName;
this.folder = folder;
}
public FileResult() {
}
public Long getFileSize() {
return fileSize;
}
public void setFileSize(Long fileSize) {
this.fileSize = fileSize;
}
public String getFileAPUrl() {
return fileAPUrl;
}
public void setFileAPUrl(String fileAPUrl) {
this.fileAPUrl = fileAPUrl;
}
public String getWebUrl() {
return webUrl;
}
public void setWebUrl(String webUrl) {
this.webUrl = webUrl;
}
public String getFileSuffix() {
return fileSuffix;
}
public void setFileSuffix(String fileSuffix) {
this.fileSuffix = fileSuffix;
}
public String getFileBucket() {
return fileBucket;
}
public void setFileBucket(String fileBucket) {
this.fileBucket = fileBucket;
}
public String getOldFileName() {
return oldFileName;
}
public void setOldFileName(String oldFileName) {
this.oldFileName = oldFileName;
}
public String getFolder() {
return folder;
}
public void setFolder(String folder) {
this.folder = folder;
}
public PutObjectResult getResult() {
return result;
}
public void setResult(PutObjectResult result) {
this.result = result;
}
}
自己写的工具类,定义了一些基本操作,可以选择不用
package gmail.zxm.dubboz1jdglweb.oss;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.CreateBucketRequest;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 阿里云oss连接工具类
*/
public class OSSUtil {
private static String ENDPOINT = "oss-cn-beijing.aliyuncs.com"; // 外网访问连接地址
private static String ACCESSKEY_ID = "LTAI4G1wZYN8j4mEFxHH63x9"; // ACCESSKEY ID
private static String ACCESSKEY_SECRET = "bUqAG9FWXHyNXPP5JjS3QxWrTJ8Bg1"; // ACCESSKEY 密码
private static String BUKET_NAME = "youzxm"; // 仓库名称
private static String SUFFER_URL = "http://youzxm.oss-cn-beijing.aliyuncs.com/"; // 上传成功图片访问url的前缀, http://仓库名.外网连接地址
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_ss"); // 日期格式化
/**
* 创建oss连接
*
* @return 返回连接对象
*/
private static OSS getOssClient() throws Exception {
OSS oss = new OSSClientBuilder().build(ENDPOINT, ACCESSKEY_ID, ACCESSKEY_SECRET);
if (oss.doesBucketExist(BUKET_NAME)) {
System.out.println("连接成功");
} else {
System.out.println("bucket不存在,创建bucket仓库");
CreateBucketRequest createBucketRequest = new CreateBucketRequest(null); // 创建bucket仓库请求
createBucketRequest.setBucketName(BUKET_NAME); // 设置仓库的名称
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead); // 设置仓库的权限为公共读
oss.createBucket(createBucketRequest); // 创建仓库
}
return oss;
}
/**
* 上传指定的文件
* @param file 文件
* @param fileType 文件类型
* @return 返回访问的url地址
*/
public static String uploadDocument(MultipartFile file, String fileType){
OSS oss = null;
// 上传成功后,访问的url:url前缀 + 文件名 进行访问
String url = null;
try {
// 获取oss连接
oss = getOssClient();
// 获取上传文件的后缀名
// String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
// 判断文件类型是否为null为null的话,则赋值为default
if (fileType == null) {
fileType = "default";
}
// 拼接文件名称
String fileName = "images/" + sdf.format(new Date()) + "_" + fileType + "_" + file.getOriginalFilename();
// 文件上传
oss.putObject(BUKET_NAME, fileName, new ByteArrayInputStream(file.getBytes()));
// 拼接返回图片的url
url = SUFFER_URL + fileName;
System.out.println("图片访问地址:" + url);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭连接
if (oss != null)
oss.shutdown();
}
// 返回url
return url;
}
/**
* 删除指定库中的指定文件
* @param imgName
* @throws Exception
*/
public static boolean deleteDocument(String imgName) {
OSS oss = null;
try {
oss = getOssClient();
oss.deleteObject(BUKET_NAME, imgName);
} catch (Exception e) {
e.printStackTrace();
}finally {
if (oss != null)
oss.shutdown();
}
return true;
}
/**
* 根据文件名删除指定文件,并上传指定的文件
* @param file 新文件
* @param fileType 新文件的类型
* @param imgName 旧文件名
* @return
*/
public static String updateDocument(MultipartFile file , String fileType,String imgName){
OSS oss = null;
String url = null;
try {
// 获取连接对象
oss = getOssClient();
// 根据文件名删除文件对象
oss.deleteObject(BUKET_NAME,imgName);
// 判断是否为null,为null则设置默认值
if (fileType == null)
fileType = "default";
// 判断文件是否为null,不为null,添加新文件
if (!file.isEmpty()){
String fileName = "images/" + sdf.format(new Date()) + "_" + fileType + "_" + file.getOriginalFilename();
oss.putObject(BUKET_NAME,fileName, new ByteArrayInputStream(file.getBytes()));
// 拼接返回图片的url
url = SUFFER_URL + fileName;
System.out.println("图片访问地址:" + url);
}
}catch (Exception e){
e.printStackTrace();
}finally {
// 判断连接对象是否为null,不为null,关闭连接
if (oss != null)
oss.shutdown();
}
// 返回访问的url地址
return url;
}
}
服务端签名上传
采用JavaScript客户端直接签名(参见JavaScript客户端签名直传)时,AccessKey ID和AcessKey Secret会暴露在前端页面,因此存在严重的安全隐患。因此,OSS提供了服务端签名后直传的方案。