参考:
文件上传
1.从request中获取文件
文件项工厂对象
当上传的文件项目比较小时,直接保存在内存中(速度比较快),
比较大时,以临时文件的形式,保存在磁盘临时文件夹(虽然速度慢些,但是内存资源是有限的)。
上传成功后需删除临时文件
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置工厂的临时文件目录:当上传文件的大小大于缓冲区临界值大小时,将使用临时文件目录缓存上传的文件
factory.setRepository(new File("D\:/filepro/temp"));
// 用于保存将文件保存在内存还是磁盘临时文件夹的临界值,1M 1024*1024
factory.setSizeThreshold(1024*1024);
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
servletFileUpload.setHeaderEncoding("UTF-8");
List<FileItem> files = new ArrayList<FileItem>();
try {
files = servletFileUpload.parseRequest(request);
} catch (FileUploadException e) {
}
2.连接amazon s3远程存储服务器
@Slf4j
@Configuration
public class AwsConfig {
@Value("${AmazonS3.accessKey}")
String accessKey;
@Value("${AmazonS3.secretKey}")
String secretKey;
@Value("${AmazonS3.endpoint}")
String endpoint;
/**
* @param
* @return com.amazonaws.services.s3.AmazonS3
* @author dingyn
* @Description 连接amazon s3远程存储服务器
* @date 2019-11-28 19:52
*/
public AmazonS3Client initConn() {
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTP);
AmazonS3Client conn = new AmazonS3Client(credentials, clientConfig);
conn.setEndpoint(endpoint);
return conn;
}
}
3.上传至文件服务器
/**
* @param is
* @param fileName
* @param companyId
* @return java.lang.String
* @author dingyn
* @Description 使用ceph对象存储 将文件存储至文件服务器
* @date 2019-11-28 19:51
*/
private String fileUpload(AmazonS3Client conn, InputStream is, String fileName, String companyId) {
String bucketName = null;
// 企业用户 通过企业id获取对应存储桶
if (StringUtil.isNotEmpty(companyId)) {
StorageBucketEntity entity = new StorageBucketEntity();
entity.setCompanyId(companyId);
QueryWrapper wrapper = new QueryWrapper();
wrapper.setEntity(entity);
StorageBucketEntity storageBucketEntity = storageBucketService.getOne(wrapper);
bucketName = storageBucketEntity.getBucketName();
// 判断该桶是否存在
if (conn.doesBucketExist(bucketName)) {
conn.putObject(bucketName, fileName, is, new ObjectMetadata());
} else {
throw new BusinessException();
}
}
// 个人用户存到默认桶
else {
bucketName = DEFAULT_BUCKET;
if (conn.doesBucketExist(bucketName)) {
conn.putObject(bucketName, fileName, is, new ObjectMetadata());
} else {
throw new BusinessException();
}
}
return bucketName;
}
4.上传
for (FileItem item : files) {
// 非文件
if (item.isFormField()) {
continue;
} else {
allNum++;
//文件名超长
if (item.getName().length() > 333) {
errorNum++;
failList.add(item.getName() + ":上传失败,文件名长度超出限制!");
log.error(item.getName() + ":上传失败,文件名长度超出限制!");
} else {
AmazonS3Client conn = awsConfig.initConn();
String bucketName = null;
// 默认当前文件上传失败
boolean successFlag = false;
// 文件唯一标识uuid (uuid+时间戳)
String uuid = (UUID.randomUUID().toString() + System.currentTimeMillis()).replaceAll("-", "");
// 真实文件名
String realName = item.getName();
// 后缀
String lastName = null;
// 处理后存储到桶内的文件名
String fileName = uuid;
if (realName.contains(".")) {
lastName = realName.substring(realName.lastIndexOf(".") + 1);
fileName = uuid + "." + lastName;
}
InputStream is = null;
try {
is = item.getInputStream();
// 3.1使用ceph对象存储至文件服务器
bucketName = fileUpload(conn, is, fileName, companyId);
successFlag = true;
} catch (Exception e) {
successFlag = false;
errorNum++;
log.error(item.getName() + ":上传失败!", e);
if (e instanceof BusinessException) {
failList.add(item.getName() + ":上传失败,存储桶不存在!");
} else {
failList.add(item.getName() + ":上传失败,请稍候再试!");
}
} finally {
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
logger.error("IOException Upload failure InputStream close error" + e);
}
}
// 3.2.文件成功上传到文件服务器后,将上传文件相关信息存到db
if (successFlag) {
try {
FileStorageEntity entity = new FileStorageEntity();
entity.setUuid(uuid);
entity.setFileName(realName);
entity.setFileSize(item.getSize());
entity.setFileType(lastName);
entity.setMineType(item.getContentType());
entity.setCompanyId(companyId);
entity.setCreateUsercode(userCode);
LocalDateTime now = LocalDateTime.now();
entity.setCreateTime(now);
entity.setModiTime(now);
entity.setEnableFlag("1");
fileStorageService.save(entity);
flists.add(entity);
// 删除缓冲区文件
item.delete();
} catch (Exception e) {
errorNum++;
failList.add(item.getName() + ":上传失败,文件信息保存出错!");
log.error(item.getName() + ":上传失败!", e);
// 当文件上传到文件服务器成功 存到db不成功时,删除文件服务器上已成功的文件
conn.deleteObject(bucketName, fileName);
}
}
conn.shutdown();
}
}
}