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

工程项目挂网在什么网站上看优秀网页

工程项目挂网在什么网站上看,优秀网页,网络营销软件代理,建设商城网站的书籍钱需求 用户可以选择以长图的形式分享本网页 方法 wkhtmltopdf wkhtmltopdf url filewkhtmltoimage url file java Runtime.getRuntime().exec() 下载 直接去官网下载对应的版本:官网 命令行使用WK > wkhtmltopdf https://www.nowcoder.com /opt/project/…

需求

用户可以选择以长图的形式分享本网页

方法

  • wkhtmltopdf
    • wkhtmltopdf url file
    • wkhtmltoimage url file
  • java
    • Runtime.getRuntime().exec()

下载

直接去官网下载对应的版本:官网

命令行使用WK

>  wkhtmltopdf https://www.nowcoder.com /opt/project/java/mycommunity-pdfs/1.pdf            
Loading pages (1/6)
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done>  wkhtmltoimage  https://www.nowcoder.com /opt/project/java/mycommunity-images/1.png     
Loading page (1/2)
Rendering (2/2)
Done// 上面那条命令生成的长图太大了,可以使用下面这条:以75%的质量输出
>  wkhtmltoimage --quality 75  https://www.nowcoder.com /opt/project/java/mycommunity-images/1.png     
Loading page (1/2)
Rendering (2/2)
Done

在java中调用

application.properties:

mycommunity.path.domain=http://localhost:8080
server.servlet.context-path=/myCommunity
# WK
wk.image.command=/usr/local/bin/wkhtmltoimage
wk.image.storage=/opt/project/java/mycommunity-images/

WK配置类,在每次程序开始运行时自动生成存放图像的文件夹

@Configuration
public class WkConfig {private static final Logger logger = LoggerFactory.getLogger(WkConfig.class);@Value("${wk.image.storage}")private String wkImageStorage;@PostConstructpublic void init(){// create the dic about WKimageFile file = new File(wkImageStorage);if(!file.exists()){file.mkdir();logger.info("create the dictionary of WKimage: " + wkImageStorage);}}
}

调用WK的控制层,因为生成长图比较耗时,所以使用异步操作,在用户操作时调用Kafka的生产者生成事件,通知消费者:

@Controller
public class ShareController implements CommunityConstant {private static final Logger logger = LoggerFactory.getLogger(ShareController.class);@Autowiredprivate EventProducer eventProducer;@Value("${mycommunity.path.domain}")private String domain;@Value("${server.servlet.context-path}")private String contextPath;@Value("${wk.image.storage}")private String wkImageStorage;@GetMapping(path = "/share")@ResponseBodypublic String share(String htmlUrl){// generate the file nameString fileName = CommunityUtil.generateUUID();// Asynchronous generation long picEvent event = new Event().setTopic(TOPIC_SHARE).setData("htmlUrl", htmlUrl).setData("fileName", fileName).setData("suffix", ".png");eventProducer.fireEvent(event);Map<String, Object> map = new HashMap<>();map.put("shareUrl", domain + contextPath + "/share/image" + fileName);return CommunityUtil.getJSONString(0, null, map);}//@GetMapping(path = "/share/image/{fileName}")public void getShareImage(@PathVariable("fileName") String fileName, HttpServletResponse response){if(StringUtils.isBlank(fileName)){throw new IllegalStateException("the file name cannot be blank");}response.setContentType("image/png");File file = new File(wkImageStorage + "/" + fileName + ".png");try {OutputStream os = response.getOutputStream();FileInputStream fis = new FileInputStream(file);byte[] data = new byte[1024];int len = 0;while ((len = fis.read(data)) != -1) {os.write(data, 0, len);}} catch (IOException e) {logger.error("querty the long image failed: ", e.getMessage());}}
}

Kafka的消费者,定义如何消费生成长图的事件:

@Component
public class EventConsumer implements CommunityConstant {@Autowiredprivate static final Logger logger = LoggerFactory.getLogger(EventConsumer.class);@Value("${wk.image.storage}")private String wkImageStorage;@Value("${wk.image.command}")private String wkImageCommand;@KafkaListener(topics = {TOPIC_SHARE})public void handleShareMessage(ConsumerRecord record) {if (record == null || record.value() == null) {logger.error("the content of the message is empty");return;}Event event = JSONObject.parseObject(record.value().toString(), Event.class);if (event == null) {logger.error("message format error");return;}String htmlUrl = (String) event.getData().get("htmlUrl");String fileName = (String) event.getData().get("fileName");String suffix = (String) event.getData().get("suffix");String cmd = wkImageCommand + " --quality 75 " + htmlUrl + " " + wkImageStorage + "/" + fileName + suffix;try {Runtime.getRuntime().exec(cmd);logger.info("generate long image successfully: " + cmd);} catch (IOException e) {logger.info("generate long image fail: " + e.getMessage());}}
}

测试

在这里插入图片描述

http://www.yayakq.cn/news/258508/

相关文章:

  • 网站留言系统编写代码2017湖北建设教育协会网站
  • 织梦做商城类网站好做吗个人备案做视频网站
  • 卖钢材做哪个宣传网站北京智能网站建设哪里有
  • 网站建设在哪里进行做微商必备十大软件
  • 做企业网站合同广铁建设集团门户网站
  • 网站运营成本卖水果网站建设的策划书
  • 网站建设翻译插件网站建设协议书模板 完整版
  • 网站建设请示鲜花店网站建设的总结
  • 网站后缀意思贵州景点网站建设方案
  • 广东金东建设工程公司网站精品课程网站建设开题报告
  • 12306网站建设河南省建设部官方网站
  • 代刷网网站建设永久免费制作网页
  • 房产网站建设方案的论文多个网站备案负责人
  • 自己怎么创建网站网络规划设计师的发证机构
  • 现在还做响应式网站吗常用网站推广方法电商
  • 建设领域行政处罚查询网站重庆艺叮点网络科技有限公司
  • 网站建设坂田站长工具网站测速
  • 网站开发外文期刊网找人做个网站多少钱
  • 河北省建设机械会网站首页广告软文怎么写
  • 武进区建设局网站怎么在id导入wordpress
  • 苏州大学网站建设目标如何站自己做网站
  • 南通优化网站价格网站开发外包公司
  • 网站必须做ssl认证电商课程
  • 流量统计网站推广法html5单页网站模板
  • 做磁力解析网站专门做招商的网站是什么情况
  • 中国工程建设协会网站成全视频免费高清观看在线动漫电影
  • 深圳市门户网站建设多少钱陕西陕煤建设集团有限公司网站
  • 医院网站队伍建设长春建设厅网站
  • 如何为网站做面包屑导航wordpress 侧边栏主题
  • 有教做路桥质检资料的网站吗企业做网站的合同