package com.zcloud.util; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyuncs.exceptions.ClientException; import com.jcraft.jsch.*; import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; import java.util.Date; import java.util.List; import java.util.Vector; import com.zcloud.entity.PageData; import com.zcloud.service.system.FileUploadLogService; import org.omg.CORBA.SystemException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; @Component public class Smb { @Resource private FileUploadLogService fileUploadLogService; private static String endpoint = "https://oss-cn-zhangjiakou.aliyuncs.com"; // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。 private static String accessKeyId = "LTAI5tK134ZzXPEwykAdpVn2"; private static String accessKeySecret = "XCEMY8FG52cXImFMeIiH4tDJ9BIN3N"; // 填写Bucket名称。 private static String bucketName = "qyag"; public static void sshSftp(MultipartFile file, String fileName, String path) throws Exception { String objectName = "YTHFile" + path + "/" + fileName; // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。 // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); try { // 创建PutObject请求。 ossClient.putObject(bucketName, objectName, file.getInputStream()); // 创建PutObjectRequest对象。 // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。 // ObjectMetadata metadata = new ObjectMetadata(); // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString()); // metadata.setObjectAcl(CannedAccessControlList.Private); // putObjectRequest.setMetadata(metadata); // 上传文件。 } catch (OSSException oe) { System.out.println("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); System.out.println("Error Message:" + oe.getErrorMessage()); System.out.println("Error Code:" + oe.getErrorCode()); System.out.println("Request ID:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (Exception ce) { System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); System.out.println("Error Message:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } public void sshSftp(MultipartFile file, String fileName, String path, String corpId) throws Exception { String objectName = "YTHFile" + path + "/" + fileName; // 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。 // 创建OSSClient实例。 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); try { // 创建PutObject请求。 ossClient.putObject(bucketName, objectName, file.getInputStream()); // 创建PutObjectRequest对象。 // 如果需要上传时设置存储类型和访问权限,请参考以下示例代码。 // ObjectMetadata metadata = new ObjectMetadata(); // metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString()); // metadata.setObjectAcl(CannedAccessControlList.Private); // putObjectRequest.setMetadata(metadata); // 上传文件。 long fileSize = file.getSize();//单位:字节 PageData pd = new PageData(); pd.put("FILEUPLOADLOG_ID", UuidUtil.get32UUID()); pd.put("CORPINFO_ID", corpId); pd.put("CREATTIME", DateUtil.date2Str(new Date())); pd.put("FILE_PATH", path + "/" + fileName); pd.put("FILE_SIZE", fileSize); fileUploadLogService.save(pd); } catch (OSSException oe) { System.out.println("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); System.out.println("Error Message:" + oe.getErrorMessage()); System.out.println("Error Code:" + oe.getErrorCode()); System.out.println("Request ID:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (Exception ce) { System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); System.out.println("Error Message:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } /** * 删除文件 * * @throws SftpException * @throws JSchException */ public static void delete(String directoryFile) throws Exception { OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); try { // 删除文件或目录。如果要删除目录,目录必须为空。 ossClient.deleteObject(bucketName, "YTHFile" + directoryFile); } catch (OSSException oe) { System.out.println("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); System.out.println("Error Message:" + oe.getErrorMessage()); System.out.println("Error Code:" + oe.getErrorCode()); System.out.println("Request ID:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (Exception ce) { System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); System.out.println("Error Message:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } public static void createDir(String createpath, ChannelSftp sftp) { try { if (isDirExist(createpath, sftp)) { sftp.cd(createpath); } String pathArry[] = createpath.split("/"); StringBuffer filePath = new StringBuffer("/"); for (String path : pathArry) { if (path.equals("")) { continue; } filePath.append(path + "/"); if (isDirExist(filePath.toString(), sftp)) { sftp.cd(filePath.toString()); } else { // 建立目录 sftp.mkdir(filePath.toString()); // 进入并设置为当前目录 sftp.cd(filePath.toString()); } } sftp.cd(createpath); } catch (SftpException e) { // throw new SystemException("创建路径错误:" + createpath); } } public static boolean isDirExist(String directory, ChannelSftp sftp) { boolean isDirExistFlag = false; try { SftpATTRS sftpATTRS = sftp.lstat(directory); isDirExistFlag = true; return sftpATTRS.isDir(); } catch (Exception e) { if (e.getMessage().toLowerCase().equals("no such file")) { isDirExistFlag = false; } } return isDirExistFlag; } public String saveFile(MultipartFile multipartFile) throws Exception { return this.saveFile(multipartFile, Const.FILEPATHFILE); } public String saveFile(MultipartFile file, String cost) throws Exception { // 生成文件名 String fileName = Warden.get32UUID() + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); // 根据项目类型生成项目文件 String filePath; if ("admin".equals(Jurisdiction.getUsername())) { filePath = cost + "admin" + "/" + DateUtil.getDays(); } else { filePath = cost + "imgFactory" + "/" + DateUtil.getDays(); } // 保存文件 this.sshSftp(file, fileName, filePath); // 返回文件保存目录 return filePath + "/" + fileName; } }