【basepro】文件上传

参考:


文件上传

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();
        }
    }
}
发布了38 篇原创文章 · 获赞 0 · 访问量 1162

猜你喜欢

转载自blog.csdn.net/qq_25046005/article/details/103371281