目录
FTP
上传[MultipartFile]文件到FTP
controller
/**
* @return com.ylz.bjyf.common.vo.ResultVO
* @method uploadFile
* @params [multipartFile, fjlx] fjlx(前台提供)
* @date 2021/4/19 23:05
* @description 上传文件--Mododb---本地表
*/
@PostMapping(value = "/upload-File")
public ResultVO uploadFile (MultipartFile file, String fjlx) throws Exception {
//判断文件类型,从而入本地库和线上库
if (fjlx.equals("04")) { //身份证正面
fjlx = "04";
return cydkBPO.uploadFile(file, fjlx);
} else if (fjlx.equals("05")) { //身份证反面
fjlx = "05";
return cydkBPO.uploadFile(file, fjlx);
} else if (fjlx.equals("06")) { //户口本正面
fjlx = "06";
return cydkBPO.uploadFile(file, fjlx);
} else {
return new ResultVO("文件上传失败");
}
}
bpo
public ResultVO uploadFile(MultipartFile file, String fjlx) throws Exception {
//************************图片压缩*****拿到multipartFile转file******************
//压缩方式1: 5.9MB-> 1.9MB
// Thumbnails.of(fromPic).scale(1f).outputQuality(0.25f).toFile(toPic);
//MultipartFile file转file
System.out.println("图片原来大小" + file.getSize());
double fileSize = file.getSize(); //拿到大小
//两个最终的
File fromPic = MultipartFileToFile.multipartFileToFile(file);
File toPic = fromPic;//toPic就是最终上传的文件
int n = 0;
if (fileSize > 1048576 && fileSize <= 5242880) //大于1MB 小于5MB
{
while (fileSize > 1048576) //如果文件大小大于1MB
{
System.out.println("1-5MB压缩" + (n++) + "次");
Thumbnails.of(fromPic).scale(0.6f).outputQuality(0.25f).toFile(toPic);//压缩成toPic
FileInputStream fileInputStreamtoPic = new FileInputStream(toPic);
MultipartFile multipartFiletoPic = new MockMultipartFile(toPic.getName(), toPic.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStreamtoPic);
System.out.println("图片压缩后大小" + multipartFiletoPic.getSize());
toPic = MultipartFileToFile.multipartFileToFile(multipartFiletoPic);
fileSize = multipartFiletoPic.getSize(); //大小赋值
fromPic = toPic; // 旧的给新的,为了循环使用
}
} else if (fileSize > 5242880 && fileSize <= 10485760) //大于5MB 小于10MB
{
while (fileSize > 1048576) //如果文件大小大于1MB
{
System.out.println("5MB-10MB压缩" + (n++) + "次");
Thumbnails.of(fromPic).scale(0.5f).outputQuality(0.25f).toFile(toPic);//压缩成toPic
FileInputStream fileInputStreamtoPic = new FileInputStream(toPic);
MultipartFile multipartFiletoPic = new MockMultipartFile(toPic.getName(), toPic.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStreamtoPic);
System.out.println("图片压缩后大小" + multipartFiletoPic.getSize());
toPic = MultipartFileToFile.multipartFileToFile(multipartFiletoPic);
fileSize = multipartFiletoPic.getSize(); //大小赋值
fromPic = toPic; // 旧的给新的,为了循环使用
}
} else if (fileSize > 10485760 && fileSize <= 20971520) { //大于10MB ,小于20MB
while (fileSize > 1048576) //如果文件大小大于1MB
{
System.out.println("10MB-20MB压缩" + (n++) + "次");
Thumbnails.of(fromPic).scale(0.4f).outputQuality(0.25f).toFile(toPic);//压缩成toPic
FileInputStream fileInputStreamtoPic = new FileInputStream(toPic);
MultipartFile multipartFiletoPic = new MockMultipartFile(toPic.getName(), toPic.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStreamtoPic);
System.out.println("图片压缩后大小" + multipartFiletoPic.getSize());
toPic = MultipartFileToFile.multipartFileToFile(multipartFiletoPic);
fileSize = multipartFiletoPic.getSize(); //大小赋值
fromPic = toPic; // 旧的给新的,为了循环使用
}
} else if (fileSize > 20971520 && fileSize <= 41943040) {
while (fileSize > 1048576) //如果文件大小大于1MB
{
System.out.println("20MB-40MB压缩" + (n++) + "次");
Thumbnails.of(fromPic).scale(0.3f).outputQuality(0.25f).toFile(toPic);//压缩成toPic
FileInputStream fileInputStreamtoPic = new FileInputStream(toPic);
MultipartFile multipartFiletoPic = new MockMultipartFile(toPic.getName(), toPic.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStreamtoPic);
System.out.println("图片压缩后大小" + multipartFiletoPic.getSize());
toPic = MultipartFileToFile.multipartFileToFile(multipartFiletoPic);
fileSize = multipartFiletoPic.getSize(); //大小赋值
fromPic = toPic; // 旧的给新的,为了循环使用
}
} else if (fileSize > 41943040) { //大于40MB
while (fileSize > 1048576) {
System.out.println("40MB以上压缩" + (n++) + "次");
Thumbnails.of(fromPic).scale(0.1f).outputQuality(0.25f).toFile(toPic);//压缩成toPic
FileInputStream fileInputStreamtoPic = new FileInputStream(toPic);
MultipartFile multipartFiletoPic = new MockMultipartFile(toPic.getName(), toPic.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStreamtoPic);
System.out.println("图片压缩后大小" + multipartFiletoPic.getSize());
toPic = MultipartFileToFile.multipartFileToFile(multipartFiletoPic);
fileSize = multipartFiletoPic.getSize(); //大小赋值
fromPic = toPic; // 旧的给新的,为了循环使用
}
}
//最终toPic是最终的File文件,转mutifile
FileInputStream fileIS = new FileInputStream(toPic);
MultipartFile Multi = new MockMultipartFile(toPic.getName(), toPic.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(), fileIS);
System.out.println("最终大小" + Multi.getSize());
//************************图片压缩************************
//存入MongoDB
String fjid = MongoDBUtil.putObject("business", Multi);//返回一个附件ID
String fileName = Multi.getOriginalFilename();
String type = Multi.getOriginalFilename().substring(Multi.getOriginalFilename().lastIndexOf("."));
String fname = fjid + type;
// //上传到FTP上面---方法一 暂时不考虑
// File dest=new File(new File("/u01/ggfw/4-xsxx/jar/ftp-data/cydk").getAbsolutePath()+"/"+fname);
// multipartFile.transferTo(dest);
try {//上传到FTP上面
PictureInfo pictureInfo = new PictureInfo(fjid, fname, fileName, fjlx);
toFtpSever(pictureInfo);
} catch (Exception e) {
return new ResultVO().addData("data", e);
}
return new ResultVO().addData("data", new PictureInfo(fjid, fname, fileName, fjlx));
}
//本地图片上传到 FTP
@Override
public ResultVO toFtpSever(PictureInfo pictureInfo) {
ResultVO vo = new ResultVO();
String url = FTPEnum.url.getLOCAlFTP();
//拿到Base64,就是文件
FSObject fjOne = MongoDBUtil.getObject("business", pictureInfo.getFjid());
try {
//图片上传到 FTP
CydkUtils.writeToLocal(url, fjOne, pictureInfo.getSname());
vo.setAppcode(ResultEnum.success.getCode());
vo.setMsg("SUCCESS");
vo.addData("returnMsg", "保存成功");
vo.addData("code", ResultEnum.success.getCode());
vo.addData("data", "");
} catch (IOException e) {
e.printStackTrace();
vo.setAppcode(ResultEnum.fail.getCode());
vo.setMsg("FAIL");
vo.addData("returnMsg", "上传保存失败");
vo.addData("code", ResultEnum.fail.getCode());
vo.addData("data", "");
}
return vo;
}
文件base64到MogoDB中
BASE64Decoder decoder = new BASE64Decoder();
byte[] bytes1 = decoder.decodeBuffer(yzdySavRetDTO.getGzs());//.getGzs()就是base64
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes1);
String GZSMOGOID = MongoDBUtil.putObjectStream("business", yzdySaveDTO.getReportId() + ".pdf", byteArrayInputStream);
public static String putObjectStream(String business, String wjmc, InputStream inputStream) throws BusinessException {
/***
* 文件流通过前台传过来的
*/
InputStream fileInputstream;
String fileType = "";
try {
if(StringUtils.isNotBlank(wjmc)) {
String[] split = wjmc.split("\\.");
List<String> list = Arrays.asList(split); //此集合无法操作添加元素
List<String> list1 = new ArrayList<String>(list); //此集合可操作元素
fileType = list1.get(1);
}
fileInputstream = inputStream;
String filename = wjmc;
FSObject fs = new FSObject();
/*** 文件类型 */
fs.setContentType(fileType);
/*** 文件流 */
fs.setInputstream(fileInputstream);
/*** 文件名称 */
fs.setName(wjmc);
/*** 文件keyid */
fs.setKeyId(wjmc);
/**** 文件大小 */
fs.setSize(fileInputstream.available());
fs = mongoUtil.fsManager.putObject(business, fs);
return fs.getKeyId();
} catch (IOException e) {
LOGGER.error("存储文件错误", e.getMessage());
throw new BusinessException("系统错误,存储文件错误" + e.getMessage());
}
}
从MogoDB获得文件的Base64
/**
* 从MogoDB中拿到图片Base64
*/
@PostMapping(value = "/getImageBase64")
public ResultVO getImageBase64(String fzsfjid) throws IOException {
System.out.println(fzsfjid);
return commBPO.getImageBase64(fzsfjid);
}
//获得图片
@Override
public ResultVO getImageBase64 (String fjid) throws IOException {
ResultVO vo = new ResultVO();
try {
FSObject fsObject = MongoDBUtil.getObject("business", fjid);
byte[] bytes = IOUtils.toByteArray(fsObject.getInputstream());
if(bytes.length>0) {
String s = Base64.getEncoder().encodeToString(bytes);
HashMap map=new HashMap();
map.put("base64",s);
vo.addData("data",map);
}else {
vo.setErrorMsg("图片获取失败");
}
} catch (IOException e) {
e.printStackTrace();
vo.setErrorMsg(e.getMessage());
}
return vo;
}
FTP下载和在线预览文件
/**
* @method downfile
* @description 下载文件
*/
@RequestMapping("downfile")
public void downfile(String path, HttpServletResponse httpServletResponse) {
try {
WordUtils.downLoad(path, httpServletResponse, false);
} catch (Exception e) {
log.info(e.getMessage());
}
}
/**
* @method downfile
* @description 在线阅览文件
*/
@RequestMapping("download")
public void download(String path, HttpServletResponse httpServletResponse) {
try {
WordUtils.downLoad(path, httpServletResponse, true);
} catch (Exception e) {
log.info(e.getMessage());
}
}
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
/**
* 文件在线产看下载
*/
public class WordUtils {
public static void downLoad(String filePath, HttpServletResponse response, boolean isOnLine) throws Exception {
System.out.println("filePath------------------" + filePath);
File f = new File(filePath);
if (!f.exists()) {
response.sendError(404, "File not found!");
return;
}
BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
byte[] buf = new byte[20480];
int len = 0;
response.reset(); // 非常重要
if (isOnLine) { // 在线打开方式
URL u = new URL("file:///" + filePath);
response.setContentType(u.openConnection().getContentType());
response.setHeader("Content-Disposition", "inline; filename=" + f.getName());
//response.setHeader("X-Frame-Options", "SAMEORIGIN");
// 文件名应该编码成UTF-8
} else { // 纯下载方式
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename=" + f.getName());
}
OutputStream out = response.getOutputStream();
while ((len = br.read(buf)) > 0)
out.write(buf, 0, len);
out.flush();
br.close();
out.close();
//f.delete();
}
}
MogoDB下载
/**
* @return void
* @method getFile
* @params [qycxQydxxDTO, response]
* @description 下载文件流
*/
@GetMapping("getFile/{serialno}")
public void getFile(@PathVariable String serialno, HttpServletResponse response) throws Exception {
printUtilBPO.getObject(serialno,response);
}
/**
* @return java.lang.String
* @method getObject
* @params [mongoId, response]
* @description 从mongodb获取文件对象
*/
@Override
public void getObject(String mongoId, HttpServletResponse response) {
InputStream inputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
FSObject fsObject = MongoDBUtil.getObject("business", mongoId);
inputStream = fsObject.getInputstream();
byte[] buffer = new byte[1024];
response.reset();
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fsObject.getName(), "UTF-8"));
response.setContentType("application/json");
bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());
int byteread;
while ((byteread = inputStream.read(buffer)) != -1)
bufferedOutputStream.write(buffer, 0, byteread);
inputStream.close();
bufferedOutputStream.flush();
bufferedOutputStream.close();
} catch (Exception e) {
log.error("下载文件流异常:", e);
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
log.error("下载文件-关闭输入流异常:", e);
}
}
if (bufferedOutputStream != null) {
try {
bufferedOutputStream.close();
} catch (IOException e) {
log.error("下载文件-关闭返回流异常:", e);
}
}
}
}