@Autowired
Environment environment;

//存储到服务器
private String fileSavePath;

//查看图片的数据库url前缀
public String photoServiceUrl;

/**
* 图片访问URL,比如//协议 :// ip地址 :端口号 / 文件目录(/images/uuid.jpg) ,如 http://127.0.0.1:8868/images/
*/

public String ftpHost;
public String ftpPort;
public String ftpUsername;
public String ftpPassword;
public String ftpBasePath;

public String prodPhotoUploadUrl;

public String prodSopUploadUrl;




public static String LOCAL_CHARSET="UTF-8";
public static String DEFAULT_CHARSET="iso-8859-1";

@PostConstruct//初始化调用
public void init(){
fileSavePath= environment.getProperty("fileSavePath");

//存储到ftp服务器相关参数
photoServiceUrl = environment.getProperty("photoServiceUrl");
ftpHost = environment.getProperty("ftp.host");
ftpPort = environment.getProperty("ftp.port");
ftpUsername = environment.getProperty("ftp.username");
ftpPassword = environment.getProperty("ftp.password");
//来料管理的图片上传地址
ftpBasePath = environment.getProperty("ftp.basePath");
//产品图片的上传地址
prodPhotoUploadUrl = environment.getProperty("prodPhotoUploadUrl");
//产品文件的上传地址
prodSopUploadUrl = environment.getProperty("prodSopFileUploadUrl");
}


Logger logger = LoggerFactory.getLogger(ImageUploadServiceImpl.class);





/**
* Description: 向FTP服务器上传文件
* @param ftpPath FTP服务器文件存放路径
* @param multipartFile 上传到FTP服务器上的文件
* @return 成功返回文件名,比如 uuid.jpg,失败返回null
*/
public String uploadFileToFtpService(String ftpPath, MultipartFile multipartFile) {

//截取文件格式后缀
String fileSuffix = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".") + 1);
String fileName;
if("doc".equals(fileSuffix) || "docx".equals(fileSuffix) || "pdf".equals(fileSuffix) || "xls".equals(fileSuffix) || "xlsx".equals(fileSuffix) || "ppt".equals(fileSuffix) || "txt".equals(fileSuffix)){
fileName = multipartFile.getOriginalFilename();
}else {
fileName = UUID.randomUUID() + "."+fileSuffix;
}

FTPClient ftpClient=null;
try {
//连接ftp
ftpClient = getFTPConnection();
if(ftpClient==null){
logger.error("ftp服务器连接失败");
return null;
}

/*该部分为逐级创建,并切换到工作目录*/
String[] split = ftpPath.split("/");
for (String str : split) {
if(StringUtils.isBlank(str)) {
continue;
}
if (!ftpClient.changeWorkingDirectory(str)) {//注意这步必须加上进入目录,否则当目录不存在时候只创建目录不进入则文件写入有问题
//防止中文编码导致目录找不到
String directory = new String(str.getBytes("UTF-8"),"iso-8859-1");
//目录不存在则创建目录
ftpClient.makeDirectory(directory);
//更换目录到当前目录,否则目录不存在时只是创建目录而不能写入文件到该目录
ftpClient.changeWorkingDirectory(directory);
}
}


ftpClient.enterLocalPassiveMode();//工作模式被动


//压缩图片到指定250K以内
byte[] bytes = PictureCompressUtils.compressPicForScale(multipartFile.getBytes(), 250);
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);

String file = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
OutputStream out = ftpClient.storeFileStream(file);//远程文件名

byte[] byteArray = new byte[4096];

int read = 0;

while ((read = inputStream.read(byteArray)) != -1) {

out.write(byteArray, 0, read);

}

out.close();


//退出登录
ftpClient.logout();


} catch (IOException e) {
logger.error(e.getMessage());
return null;
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException ioe) {
}
}
}
return fileName;
}

/**
* 连接FTP服务器
* @return
*/
private FTPClient getFTPConnection(){
try {
//创建ftp客户端
FTPClient ftpClient = new FTPClient();

//FTP服务器端口,默认21,使用默认端口可以不写
ftpClient.connect(ftpHost,Integer.parseInt(ftpPort));// 连接FTP服务器

// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftpClient.login(ftpUsername, ftpPassword);// 登录

if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
logger.info("登录成功");
ftpClient.setControlEncoding("UTF-8");
ftpClient.enterLocalPassiveMode();//设置被动模式
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);//设置传输模式,一定要设置二进制传输格式

return ftpClient;
}else{
//登录失败返回Null
ftpClient.disconnect();
return null;
}
} catch (IOException e) {
return null;
}


}



////////////////////////////压缩图片工具类////////////////////////////////////////////
1.引入依赖
<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.17</version>
</dependency>

2.编写工具类
package com.xc.mes.mesincomingmgr.incoming.service.impl;


import net.coobird.thumbnailator.Thumbnails;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

public class PictureCompressUtils {


//以下是常量,按照阿里代码开发规范,不允许代码中出现魔法值
private static final Logger logger = LoggerFactory.getLogger(PictureCompressUtils.class);
private static final Integer ZERO = 0;
private static final Integer ONE_ZERO_TWO_FOUR = 1024;
private static final Integer NINE_ZERO_ZERO = 900;
private static final Integer THREE_TWO_SEVEN_FIVE = 3275;
private static final Integer TWO_ZERO_FOUR_SEVEN = 2047;
private static final Double ZERO_EIGHT_FIVE = 0.85;
private static final Double ZERO_SIX = 0.6;
private static final Double ZERO_FOUR_FOUR = 0.44;
private static final Double ZERO_FOUR = 0.4;






/**
* 根据指定大小压缩图片
*
* @param imageBytes 源图片字节数组
* @param desFileSize 指定图片大小,单位kb
* @return 压缩质量后的图片字节数组
*/
public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) {
if (imageBytes == null || imageBytes.length <= ZERO || imageBytes.length < desFileSize * ONE_ZERO_TWO_FOUR) {
return imageBytes;
}
long srcSize = imageBytes.length;
double accuracy = getAccuracy(srcSize / ONE_ZERO_TWO_FOUR);
try {
while (imageBytes.length > desFileSize * ONE_ZERO_TWO_FOUR) {
ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
Thumbnails.of(inputStream)
.scale(accuracy)
.outputQuality(accuracy)
.toOutputStream(outputStream);
imageBytes = outputStream.toByteArray();
}
logger.info("图片原大小={}kb | 压缩后大小={}kb",
srcSize / ONE_ZERO_TWO_FOUR, imageBytes.length / ONE_ZERO_TWO_FOUR);
} catch (Exception e) {
logger.error("【图片压缩】msg=图片压缩失败!", e);
}
return imageBytes;
}


/**
* 自动调节精度(经验数值)
*
* @param size 源图片大小
* @return 图片压缩质量比
*/
private static double getAccuracy(long size) {
double accuracy;
if (size < NINE_ZERO_ZERO) {
accuracy = ZERO_EIGHT_FIVE;
} else if (size < TWO_ZERO_FOUR_SEVEN) {
accuracy = ZERO_SIX;
} else if (size < THREE_TWO_SEVEN_FIVE) {
accuracy = ZERO_FOUR_FOUR;
} else {
accuracy = ZERO_FOUR;
}
return accuracy;
}























}
















原文地址:http://www.cnblogs.com/shaowangwu/p/16810638.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性