当前位置: 首页 > wzjs >正文

专业模板网站制作价格重庆网站优化

专业模板网站制作价格,重庆网站优化,网站建设犀牛,山东平台网站建设价位上传图片接口 接口接收图片文件和布尔类型的是否生成缩略图参数。 生成保存图片文件的文件夹,文件夹的命名为上传图片的日期“根目录\file\cover\202504”,如果文件夹已存在则不生成。接下来拼接文件名,生成30位的随机数拼接到原文件名防止文件名相同的…

上传图片接口

在这里插入图片描述
接口接收图片文件和布尔类型的是否生成缩略图参数。

  1. 生成保存图片文件的文件夹,文件夹的命名为上传图片的日期“根目录\file\cover\202504”,如果文件夹已存在则不生成。
  2. 接下来拼接文件名,生成30位的随机数拼接到原文件名防止文件名相同的情况,保存图片到目标目录。
  3. 通过第二个参数判断是否需要生成缩略图,如果需要则执行createThumbnail(String filePath)
    (下面会介绍这个函数)。
  4. 最后返回保存图片的文件路径。
@RequestMapping("/uploadImage")
public ResponseVO uploadImage(@NotNull MultipartFile file,@NotNull Boolean thumbnail) throws IOException, BusinessException {String month = DateUtils.format(new Date(), DateTimePatternEnum.YYYYMM.getPattern());// 根目录/file/cover/日期String folder = appConfig.getProjectFolder() + Constants.FILE_FOLDER + Constants.FILE_COVER + month;File folderFile = new File(folder);if(!folderFile.exists()){folderFile.mkdirs();}String fileName = file.getOriginalFilename();String fileSuffix = StringTools.getFileSuffix(fileName);String realFileName = StringTools.getRandomNumber(30) + fileSuffix;String filePath = folder + "/" + realFileName;file.transferTo(new File(filePath));if(thumbnail){fFmpegUtils.createThumbnail(filePath);}// cover/日期/realFileNamereturn getSuccessResponseVO(Constants.FILE_COVER + month + "/" + realFileName);
}

createThumbnail(String filePath) 负责拼接ffmpeg指令,把指令丢给 executeCommand(String cmd, Boolean showLog) 函数执行命令。

public void createThumbnail(String filePath) throws BusinessException {String CMD = "ffmpeg -i \"%s\" -vf scale=200:-1 \"%s\" ";CMD = String.format(CMD,filePath,filePath+ Constants.IMAGE_THUMBNAIL_SUFFIX);ProcessUtils.executeCommand(CMD,false);
}

executeCommand 函数传入指令是否打印日志这两个参数:

  1. 判断当前系统类型是Windows还是Linux,Windows:直接执行命令,Linux:用 sh -c 包装命令。
  2. 异步读取输出流和错误流,必须要取出ffmpeg在执行命令过程中产生的输出信息,如果不取的话当输出流信息填满jvm存储输出留信息的缓冲区时,线程就回阻塞住。
  3. 等待ffmpeg命令执行完,拼接输出的结果,如果需要打印日志则输出。
  4. 在finally里摧毁FFmpeg进程。
ublic class ProcessUtils {private static final Logger logger = LoggerFactory.getLogger(ProcessUtils.class);private static final String osName = System.getProperty("os.name").toLowerCase();public static String executeCommand(String cmd, Boolean showLog) throws BusinessException {if (StringTools.isEmpty(cmd)) {return null;}Runtime runtime = Runtime.getRuntime();Process process = null;try {//判断操作系统if (osName.contains("win")) {process = Runtime.getRuntime().exec(cmd);} else {process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", cmd});}// 取出输出流和错误流的信息PrintStream errorStream = new PrintStream(process.getErrorStream());PrintStream inputStream = new PrintStream(process.getInputStream());errorStream.start();inputStream.start();// 等待ffmpeg命令执行完process.waitFor();// 获取执行结果字符串String result = errorStream.stringBuffer.append(inputStream.stringBuffer + "\n").toString();// 输出执行的命令信息if (showLog) {logger.info("执行命令{}结果{}", cmd, result);}return result;} catch (Exception e) {logger.error("执行命令失败cmd{}失败:{} ", cmd, e.getMessage());throw new BusinessException("视频转换失败");} finally {if (null != process) {ProcessKiller ffmpegKiller = new ProcessKiller(process);runtime.addShutdownHook(ffmpegKiller);}}}/*** 在程序退出前结束已有的FFmpeg进程*/private static class ProcessKiller extends Thread {private Process process;public ProcessKiller(Process process) {this.process = process;}@Overridepublic void run() {this.process.destroy();}}/*** 用于取出ffmpeg线程执行过程中产生的各种输出和错误流的信息*/static class PrintStream extends Thread {InputStream inputStream = null;BufferedReader bufferedReader = null;StringBuffer stringBuffer = new StringBuffer();public PrintStream(InputStream inputStream) {this.inputStream = inputStream;}@Overridepublic void run() {try {if (null == inputStream) {return;}bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String line = null;while ((line = bufferedReader.readLine()) != null) {stringBuffer.append(line);}} catch (Exception e) {logger.error("读取输入流出错了!错误信息:" + e.getMessage());} finally {try {if (null != bufferedReader) {bufferedReader.close();}if (null != inputStream) {inputStream.close();}} catch (IOException e) {logger.error("调用PrintStream读取输出流后,关闭流时出错!");}}}}
}

运行结果

在这里插入图片描述
在这里插入图片描述

获取图片接口

传入图片路径参数。

  1. 判断路径是否为空或者路径格式不正确。
  2. 设置响应类型,设置缓存策略。
  3. 从本地磁盘中读取文件并写入到 response 输出流中。
  4. 关闭文件流和输出流。
@RequestMapping("/getResource")
public void getResource(HttpServletResponse response,@NotNull String sourceName) throws BusinessException, IOException {if(!StringTools.pathIsOk(sourceName)){throw new BusinessException(ResponseCodeEnum.CODE_600);}String suffix = StringTools.getFileSuffix(sourceName);response.setContentType("image/"+suffix.replace(".",""));response.setHeader("Cache-Control","max-age=2592000");readFile(response,sourceName);
}
// filePath = cover/23001/realFileName
protected void readFile(HttpServletResponse response,String filePath) throws IOException {// 根目录/file/cover/23001/realFileNameFile file = new File(appConfig.getProjectFolder() + Constants.FILE_FOLDER + filePath);if(!file.exists()){return;}try(OutputStream out = response.getOutputStream(); FileInputStream in = new FileInputStream(file)){byte[] byteData = new byte[1024];int len = 0;while ((len = in.read(byteData)) != -1) {out.write(byteData, 0, len);}out.flush();}catch (Exception e){log.error("读取文件异常",e);}
}

运行结果

在这里插入图片描述

http://www.dtcms.com/wzjs/144159.html

相关文章:

  • 做网站要用写接口6找个免费的网站
  • 忘记网站后台登陆地址百度seo教程视频
  • 谁有做任务网站关键词seo排名怎么样
  • 个人电脑做网站打不开数据库外贸网站哪个比较好
  • 专业网站建设品牌网址域名ip查询
  • 网站建设与设计摘要工业设计公司
  • 星子网新闻事件seo专员招聘
  • 用ps做网站页面搜索引擎优化名词解释
  • visual studio 网站开发网站排名工具
  • 卫龙的网站是谁做的西安百度推广运营
  • 最新网站建设软件有哪些广西关键词优化公司
  • 郴州网站制作公司地址网络营销的策略包括
  • 广州建设工程招标信息网搜索引擎优化是做什么的
  • 做汽配网站如何优化网站首页
  • 什么网站可以做效果图怎么可以在百度发布信息
  • 公司做公司网站重庆快速排名优化
  • 定制网站开发系统网络推广吧
  • 怎样做网站的签约设计师湖南靠谱的关键词优化哪家好
  • 佟年给韩商言做的网站好用的搜索引擎有哪些
  • 卖汽车的网站怎么做的吗合肥网络优化推广公司
  • 做动漫网站需要服务器么线下推广活动策划方案
  • 做网站的软件叫81什么来着国家再就业免费培训网
  • 营销类网站有哪些百度指数教程
  • 浏览器打开网站404怎么把产品快速宣传并推广
  • 容桂医疗网站建设制作一个网站的流程有哪些
  • 怎么做网页版手机版网站seo软件全套
  • wordpress安装数据库重庆seo扣费
  • 建设电子商务网站背景软文文案范文
  • 网站免费搭建流量平台有哪些
  • 个人网页设计作品简单seo软件系统