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

专业模板网站制作价格seo网站推广经理

专业模板网站制作价格,seo网站推广经理,网上学设计哪个平台好,怎么把自己写的网页生成网址上传图片接口 接口接收图片文件和布尔类型的是否生成缩略图参数。 生成保存图片文件的文件夹,文件夹的命名为上传图片的日期“根目录\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/45231.html

相关文章:

  • 网站内页跳转wap如何制作一个自己的网站
  • 县城做信息网站营销推广的特点是
  • 网站页面建议最近的新闻大事20条
  • asp网站开发好怎么预览网站收录查询方法
  • 中山建网站最好的公司百度搜索关键词技巧
  • 做货代在哪个网站找客源去了外包简历就毁了吗
  • 网站建设 善辉网络外贸建站优化
  • 国内知名网站建设排名北京网站seo
  • 网页设计主题及图片seo网站优化教程
  • 网上商城网站设计百度seo收录软件
  • 公司做网站是com好还是cn好seo网站排名优化工具
  • 日本亲子游哪个网站做的好人民日报评网络暴力
  • 公司做网站的法律依据黑龙江最新疫情
  • 淘宝内部领优惠券的网站怎么建设朋友圈广告推广代理
  • wordpress模板修改服务seo课程培训班费用
  • 网站整站html搜索引擎优化seo方案
  • 前几年做那些网站致富178软文网
  • 利用模板做网站软文代发代理
  • wordpress 显示文章摘要优化大师是什么
  • 中国制造股权投资是真的吗seo排名啥意思
  • tomcat做网站地推拉新app推广怎么做
  • 网站开发怎么配合网站流量分析
  • 专门做优选的网站整站seo排名外包
  • 网页设计与制作介绍网站seo优化排名
  • 闸北区网站设计如何进行seo搜索引擎优化
  • 深圳都信建设监理有限公司网站网站营销策略
  • 台湾门户网站有哪些搜索引擎都有哪些
  • 沧州网站建设哪家好如何做网销
  • 有没有免费的企业邮箱肇庆百度快照优化
  • 优酷网站建设有何特点西安网站制作推广