阿里云 oss服务器文件上传 java
2017-05-05 11:41
639 查看
前天做oss服务器文件上传,之前没了解过,做的过程中遇到许多问题,最终通过查阅相关资料解决了,特分享一下。
首先准备工作 必要的jar
这里注意版本一致,不然就会报很多坑爹的错误。。
如果你断点调试在执行putObject方法时报错,99%的是jar包有问题。。
然后是配置文件
现在开通oss,都是免费开通的,包年9块钱。
这是几个必要的参数,既然做这个肯定 要知道的!这里就不多做解释了。
这里,首先需要我们创建一个OSS信息实体类,OSSConfigure.Java,用来读取配置文件的信息,封装成实体。
然后就是创建一个OSS文件管理的OSSManageUtil工具类。oss文件存储实际上就是对Object的操作,只要写好路径,都会自动创建的,OSSClient是oss的核心,有兴趣的可以多研究下。我做这个 是要上传app,以及压缩图片后上传,contentType这个方法注意,我上传的是apk 所以要用这个类型application/octet-stream,之前因为这个找了半天错。
package com.cdy.utils;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
/**
* 对OSS服务器进行上传删除等的处理
*
* @ClassName: OSSManageUtil
* @Description:
* @author liux
* @date 2017-5-3 上午10:47:00
*
*/
public class OSSManageUtil {
/**
* 上传OSS服务器文件 @Title: uploadFile
* @param multipartFile spring 上传的文件
* remotePath @param oss服务器二级目录
* @throws Exception 设定文件 @return String
* 返回类型 @throws
*/
public static String uploadFile(InputStream fileContent, String remotePath,String fileName) throws Exception {
//随机名处理
fileName = "lxkc_" + new Date().getTime() + fileName.substring(fileName.lastIndexOf("."));
// 加载配置文件,初始化OSSClient
OSSConfigure ossConfigure = new OSSConfigure("/system.properties");
OSSClient ossClient = new OSSClient(ossConfigure.getEndpoint(), ossConfigure.getAccessKeyId(),
ossConfigure.getAccessKeySecret());
// 定义二级目录
String remoteFilePath = remotePath.substring(0, remotePath.length()).replaceAll("\\\\", "/") + "/";
// 创建上传Object的Metadata
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(fileContent.available());
objectMetadata.setContentEncoding("utf-8");
objectMetadata.setCacheControl("no-cache");
objectMetadata.setHeader("Pragma", "no-cache");
objectMetadata.setContentType(contentType(fileName.substring(fileName.lastIndexOf("."))));
objectMetadata.setContentDisposition("inline;filename=" + fileName);
// 上传文件
ossClient.putObject(ossConfigure.getBucketName(), remoteFilePath + fileName, fileContent, objectMetadata);
// 关闭OSSClient
ossClient.shutdown();
// 关闭io流
fileContent.close();
return ossConfigure.getAccessUrl() + "/" + remoteFilePath + fileName;
}
// 下载文件
@SuppressWarnings("unused")
public static void downloadFile(OSSConfigure ossConfigure, String key, String filename)
throws OSSException, ClientException, IOException {
// 初始化OSSClient
OSSClient ossClient = new OSSClient(ossConfigure.getEndpoint(), ossConfigure.getAccessKeyId(),
ossConfigure.getAccessKeySecret());
OSSObject object = ossClient.getObject(ossConfigure.getBucketName(), key);
// 获取ObjectMeta
ObjectMetadata meta = object.getObjectMetadata();
// 获取Object的输入流
InputStream objectContent = object.getObjectContent();
ObjectMetadata objectData = ossClient.getObject(new GetObjectRequest(ossConfigure.getBucketName(), key),
new File(filename));
// 关闭数据流
objectContent.close();
}
/**
* 根据key删除OSS服务器上的文件 @Title: deleteFile @Description: @param @param
* ossConfigure @param @param filePath 设定文件 @return void 返回类型 @throws
* @throws IOException
*/
public static void deleteFile( String filePath) throws IOException {
// 加载配置文件,初始化OSSClient
OSSConfigure ossConfigure = new OSSConfigure("/system.properties");
OSSClient ossClient = new OSSClient(ossConfigure.getEndpoint(), ossConfigure.getAccessKeyId(),
ossConfigure.getAccessKeySecret());
filePath=filePath.substring(45);
ossClient.deleteObject(ossConfigure.getBucketName(), filePath);
}
/**
* Description: 判断OSS服务文件上传时文件的contentType @Version1.0
*
* @param FilenameExtension
* 文件后缀
* @return String
*/
public static String contentType(String FilenameExtension) {
if (FilenameExtension.equals(".BMP") || FilenameExtension.equals(".bmp")) {
return "image/bmp";
}
if (FilenameExtension.equals(".GIF") || FilenameExtension.equals(".gif")) {
return "image/gif";
}
if (FilenameExtension.equals(".JPEG") || FilenameExtension.equals(".jpeg") || FilenameExtension.equals(".JPG")
|| FilenameExtension.equals(".jpg") || FilenameExtension.equals(".PNG")
|| FilenameExtension.equals(".png")) {
return "image/jpeg";
}
if (FilenameExtension.equals(".HTML") || FilenameExtension.equals(".html")) {
return "text/html";
}
if (FilenameExtension.equals(".TXT") || FilenameExtension.equals(".txt")) {
return "text/plain";
}
if (FilenameExtension.equals(".VSD") || FilenameExtension.equals(".vsd")) {
return "application/vnd.visio";
}
if (FilenameExtension.equals(".PPTX") || FilenameExtension.equals(".pptx") || FilenameExtension.equals(".PPT")
|| FilenameExtension.equals(".ppt")) {
return "application/vnd.ms-powerpoint";
}
if (FilenameExtension.equals(".DOCX") || FilenameExtension.equals(".docx") || FilenameExtension.equals(".DOC")
|| FilenameExtension.equals(".doc")) {
return "application/msword";
}
if (FilenameExtension.equals(".XML") || FilenameExtension.equals(".xml")) {
return "text/xml";
}
if (FilenameExtension.equals(".apk") || FilenameExtension.equals(".APK")) {
return "application/octet-stream";
}
return "text/html";
}
}
以上是主要代码,再贴一下我的controller,我这里是做的app文件上传
/**
* app文件上传
*
* @param imageFile
* @param request
* @return
*/
@RequestMapping(value = "/uploadApp", method = RequestMethod.POST)
@ResponseBody
public ImportResponse uploadApp(@RequestParam("app") MultipartFile appFile, VersionUpgrade versionUpgrade) {
if (versionUpgrade == null) {
return ImportResponse.fail("上传失败!");
}
try {
// 流转换 将MultipartFile转换为oss所需的InputStream
CommonsMultipartFile cf = (CommonsMultipartFile) appFile;
DiskFileItem fi = (DiskFileItem) cf.getFileItem();
InputStream fileContent = fi.getInputStream();
String fileName = fi.getName();
String apkUrl = OSSManageUtil.uploadFile( fileContent, "xxapp",fileName);
versionUpgrade.setApkUrl(apkUrl);
versionUpgrade.setLoginUserVw(curUser);
versionUpgradeManager.save(versionUpgrade);
} catch (Exception e) {
log.error("【app上传失败】 :", e);
return ImportResponse.fail("上传失败!");
}
return ImportResponse.success("上传成功!");
}
以上就是全部内容了,都是api里面有的,因为自己做的过程中出现很多问题,所以分享给大家!
首先准备工作 必要的jar
这里注意版本一致,不然就会报很多坑爹的错误。。
如果你断点调试在执行putObject方法时报错,99%的是jar包有问题。。
然后是配置文件
现在开通oss,都是免费开通的,包年9块钱。
这是几个必要的参数,既然做这个肯定 要知道的!这里就不多做解释了。
这里,首先需要我们创建一个OSS信息实体类,OSSConfigure.Java,用来读取配置文件的信息,封装成实体。
import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * oss相关参数实体 * @author liux *2017/5/5 */ public class OSSConfigure { private String endpoint; private String accessKeyId; private String accessKeySecret; private String bucketName; private String accessUrl; public OSSConfigure() { b790 } /** * 通过配置文件.properties文件获取,这几项内容。 * * @param storageConfName * @throws IOException */ public OSSConfigure(String storageConfName) throws IOException { Properties prop = new Properties(); InputStream is= super.getClass().getClassLoader().getResourceAsStream(storageConfName); prop.load(is); endpoint = prop.getProperty("Endpoint").trim(); accessKeyId = prop.getProperty("AccessKey").trim(); accessKeySecret = prop.getProperty("AccessKeySecret").trim(); bucketName = prop.getProperty("BucketName").trim(); accessUrl = prop.getProperty("accessUrl").trim(); } public OSSConfigure(String endpoint, String accessKeyId, String accessKeySecret, String bucketName, String accessUrl) { this.endpoint = endpoint; this.accessKeyId = accessKeyId; this.accessKeySecret = accessKeySecret; this.bucketName = bucketName; this.accessUrl = accessUrl; } public String getEndpoint() { return endpoint; } public void setEndpoint(String endpoint) { this.endpoint = endpoint; } public String getAccessKeyId() { return accessKeyId; } public void setAccessKeyId(String accessKeyId) { this.accessKeyId = accessKeyId; } public String getAccessKeySecret() { return accessKeySecret; } public void setAccessKeySecret(String accessKeySecret) { this.accessKeySecret = accessKeySecret; } public String getBucketName() { return bucketName; } public void setBucketName(String bucketName) { this.bucketName = bucketName; } public String getAccessUrl() { return accessUrl; } public void setAccessUrl(String accessUrl) { this.accessUrl = accessUrl; } }
然后就是创建一个OSS文件管理的OSSManageUtil工具类。oss文件存储实际上就是对Object的操作,只要写好路径,都会自动创建的,OSSClient是oss的核心,有兴趣的可以多研究下。我做这个 是要上传app,以及压缩图片后上传,contentType这个方法注意,我上传的是apk 所以要用这个类型application/octet-stream,之前因为这个找了半天错。
package com.cdy.utils;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
/**
* 对OSS服务器进行上传删除等的处理
*
* @ClassName: OSSManageUtil
* @Description:
* @author liux
* @date 2017-5-3 上午10:47:00
*
*/
public class OSSManageUtil {
/**
* 上传OSS服务器文件 @Title: uploadFile
* @param multipartFile spring 上传的文件
* remotePath @param oss服务器二级目录
* @throws Exception 设定文件 @return String
* 返回类型 @throws
*/
public static String uploadFile(InputStream fileContent, String remotePath,String fileName) throws Exception {
//随机名处理
fileName = "lxkc_" + new Date().getTime() + fileName.substring(fileName.lastIndexOf("."));
// 加载配置文件,初始化OSSClient
OSSConfigure ossConfigure = new OSSConfigure("/system.properties");
OSSClient ossClient = new OSSClient(ossConfigure.getEndpoint(), ossConfigure.getAccessKeyId(),
ossConfigure.getAccessKeySecret());
// 定义二级目录
String remoteFilePath = remotePath.substring(0, remotePath.length()).replaceAll("\\\\", "/") + "/";
// 创建上传Object的Metadata
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(fileContent.available());
objectMetadata.setContentEncoding("utf-8");
objectMetadata.setCacheControl("no-cache");
objectMetadata.setHeader("Pragma", "no-cache");
objectMetadata.setContentType(contentType(fileName.substring(fileName.lastIndexOf("."))));
objectMetadata.setContentDisposition("inline;filename=" + fileName);
// 上传文件
ossClient.putObject(ossConfigure.getBucketName(), remoteFilePath + fileName, fileContent, objectMetadata);
// 关闭OSSClient
ossClient.shutdown();
// 关闭io流
fileContent.close();
return ossConfigure.getAccessUrl() + "/" + remoteFilePath + fileName;
}
// 下载文件
@SuppressWarnings("unused")
public static void downloadFile(OSSConfigure ossConfigure, String key, String filename)
throws OSSException, ClientException, IOException {
// 初始化OSSClient
OSSClient ossClient = new OSSClient(ossConfigure.getEndpoint(), ossConfigure.getAccessKeyId(),
ossConfigure.getAccessKeySecret());
OSSObject object = ossClient.getObject(ossConfigure.getBucketName(), key);
// 获取ObjectMeta
ObjectMetadata meta = object.getObjectMetadata();
// 获取Object的输入流
InputStream objectContent = object.getObjectContent();
ObjectMetadata objectData = ossClient.getObject(new GetObjectRequest(ossConfigure.getBucketName(), key),
new File(filename));
// 关闭数据流
objectContent.close();
}
/**
* 根据key删除OSS服务器上的文件 @Title: deleteFile @Description: @param @param
* ossConfigure @param @param filePath 设定文件 @return void 返回类型 @throws
* @throws IOException
*/
public static void deleteFile( String filePath) throws IOException {
// 加载配置文件,初始化OSSClient
OSSConfigure ossConfigure = new OSSConfigure("/system.properties");
OSSClient ossClient = new OSSClient(ossConfigure.getEndpoint(), ossConfigure.getAccessKeyId(),
ossConfigure.getAccessKeySecret());
filePath=filePath.substring(45);
ossClient.deleteObject(ossConfigure.getBucketName(), filePath);
}
/**
* Description: 判断OSS服务文件上传时文件的contentType @Version1.0
*
* @param FilenameExtension
* 文件后缀
* @return String
*/
public static String contentType(String FilenameExtension) {
if (FilenameExtension.equals(".BMP") || FilenameExtension.equals(".bmp")) {
return "image/bmp";
}
if (FilenameExtension.equals(".GIF") || FilenameExtension.equals(".gif")) {
return "image/gif";
}
if (FilenameExtension.equals(".JPEG") || FilenameExtension.equals(".jpeg") || FilenameExtension.equals(".JPG")
|| FilenameExtension.equals(".jpg") || FilenameExtension.equals(".PNG")
|| FilenameExtension.equals(".png")) {
return "image/jpeg";
}
if (FilenameExtension.equals(".HTML") || FilenameExtension.equals(".html")) {
return "text/html";
}
if (FilenameExtension.equals(".TXT") || FilenameExtension.equals(".txt")) {
return "text/plain";
}
if (FilenameExtension.equals(".VSD") || FilenameExtension.equals(".vsd")) {
return "application/vnd.visio";
}
if (FilenameExtension.equals(".PPTX") || FilenameExtension.equals(".pptx") || FilenameExtension.equals(".PPT")
|| FilenameExtension.equals(".ppt")) {
return "application/vnd.ms-powerpoint";
}
if (FilenameExtension.equals(".DOCX") || FilenameExtension.equals(".docx") || FilenameExtension.equals(".DOC")
|| FilenameExtension.equals(".doc")) {
return "application/msword";
}
if (FilenameExtension.equals(".XML") || FilenameExtension.equals(".xml")) {
return "text/xml";
}
if (FilenameExtension.equals(".apk") || FilenameExtension.equals(".APK")) {
return "application/octet-stream";
}
return "text/html";
}
}
以上是主要代码,再贴一下我的controller,我这里是做的app文件上传
/**
* app文件上传
*
* @param imageFile
* @param request
* @return
*/
@RequestMapping(value = "/uploadApp", method = RequestMethod.POST)
@ResponseBody
public ImportResponse uploadApp(@RequestParam("app") MultipartFile appFile, VersionUpgrade versionUpgrade) {
if (versionUpgrade == null) {
return ImportResponse.fail("上传失败!");
}
try {
// 流转换 将MultipartFile转换为oss所需的InputStream
CommonsMultipartFile cf = (CommonsMultipartFile) appFile;
DiskFileItem fi = (DiskFileItem) cf.getFileItem();
InputStream fileContent = fi.getInputStream();
String fileName = fi.getName();
String apkUrl = OSSManageUtil.uploadFile( fileContent, "xxapp",fileName);
versionUpgrade.setApkUrl(apkUrl);
versionUpgrade.setLoginUserVw(curUser);
versionUpgradeManager.save(versionUpgrade);
} catch (Exception e) {
log.error("【app上传失败】 :", e);
return ImportResponse.fail("上传失败!");
}
return ImportResponse.success("上传成功!");
}
以上就是全部内容了,都是api里面有的,因为自己做的过程中出现很多问题,所以分享给大家!
相关文章推荐
- Java图片文件上传阿里云OSS服务器
- 阿里云oss服务器文件上传JAVA
- java 上传文件到oss(阿里云)
- oss上传文件阿里云(Java与js版本)
- java 简单的文件上传下载服务器模型(IO + 多线程)
- Java文件上传(在SpringMVC模式下,从本地上传到服务器)
- 上传 超大文件( 4G) 到 java socket 服务器
- JAVA连接FTP服务器,并上传/下载文件代码
- Windows环境下用C#编程将文件上传至阿里云OSS笔记
- java实现把文件上传至ftp服务器
- Java FTP 实现跨服务器文件上传下载
- Java 服务器多线程处理文件上传
- (Android)JavaSocket编程,文件上传到服务器,客户端Android,服务器端J2SE
- java向ftp服务器上传下载删除文件
- Java 将文件上传至服务器
- Java FTP 实现跨服务器文件上传下载
- java做的比较完善的FTP上传下载文件服务器源码
- java 远程调用shell 上传文件到服务器
- 使用 Flex 和Java servlets 将文件上传到 RED5 服务器的步骤
- JAVA NIO SOCKET大文件上传服务器