文件转换成byte数组文件转换成byte数组有两种方式:1. 传统方式File file = new File("/temp/abc.txt");FileInputStream fis = new FileInputStream(file);byte[] bytesArray = new byte[(int)file.length()]; //init array with file lengthfis.read(bytesArray); //read file into bytes[]fis.close();return bytesArray;或者File file = new File("D:/a.jpg");FileInputStream is=new FileInputStream(file);byte[] bytes=new byte[is.available()];is.read(bytes);is.close();2. NIO方式String filePath = "/temp/abc.txt";byte[] bFile = Files.readAllBytes(new File(filePath).toPath());//or thisbyte[] bFile = Files.readAllBytes(Paths.get(filePath));byte数组转换成文件byte数组转换成文件也有两种方式:1. 传统方式FileOutputStream fos = new FileOutputStream(fileDest);fos.write(bytesArray);fos.close();2. NIO方式Path path = Paths.get(fileDest);Files.write(path, bytesArray);作者:Java_Explorer链接:https://www.jianshu.com/p/b8b8f1ded401
代码如下: public static void main(String[] args) throws IOException { String path = "D:/a.jpg"; File file = new File(path); FileInputStream is=new FileInputStream(file); byte[] bytes=new byte[is.available()]; StringBuilder sb = new StringBuilder(); is.read(bytes); is.close(); for (byte aByte : bytes) {// sb.append(aByte); sb.append(Integer.toBinaryString(aByte)); } System.out.println(sb); }
例如:急于做个简单的公司网页,仅仅介绍什么的即可,但是苦于找不到合适的模板,怎么办呢?可以将其他网站网页保存到电脑嘛,然后进行修改?但是浏览器保存的网页目录结构全到一个目录了。下面给大家介绍两款可以解决燃眉之急的软件:WebDown(现更名为 网页模板下载工具)webdown网站下载器是一款可以让你自由下载指定网站的各种内容的下载工具,自由指定站点、自由下载各种内容,同时自动为你下载各种文件和网页内容,功能强大操作简单,需要的朋友赶快下载试试!1.0测试版下载链接:https://pan.baidu.com/s/1diAJ2Z6ZpHmKpXcgm3RqOg 提取码:fzqu 复制这段内容后打开百度网盘手机App,操作更方便哦2018版本下载链接:https://pan.baidu.com/s/1ONrAN5Gy89NUthBjzRZfBA 提取码:iqb5 复制这段内容后打开百度网盘手机App,操作更方便哦注:1.0版本免费,2018版本可免费试用30次,之后需付费。teleport ultrateleport ultra是Tennyson Maxwell公司研发的一款网站整站下载软件,它能够将整个网站的内容,包括图片、文字、视频等等内容都下载到你的电脑上,让用户即使在没有网络的状态下也能够完整的查看这个网站上的说有内容,且整个网站的链接、内容都是与在网页上一模一样的。可以下载网站的网页并且保留网页的基本目录结构,也比较实用。下载链接:https://pan.baidu.com/s/1umV3jh-3vsg5pr0WjYY-0g 提取码:nu2g 复制这段内容后打开百度网盘手机App,操作更方便哦
这是很早以前的代码了,找到来一起分享学习吧。该代码适合手机端。HTML5 Clear增加了以下功能:本地存储更坚固的结构更强大的触摸事件处理更多的功能,只要拖动向上/向下多点触控(WIP)下载地址:链接:https://pan.baidu.com/s/18mcVmayFndhrg6T0dPoUJQ 提取码:j3bk 复制这段内容后打开百度网盘手机App,操作更方便哦
http://www.wisecleaner.com 当然你也可以用360自带的。。
设置response响应信息即可(先将文件流转成byte[])@RequestMapping(value = "down1", method = RequestMethod.GET)public void downloadAllClassmate(HttpServletResponse response) throws IOException { byte[] bytes = new byte[100]; String fileName="test.pdf"; response.setContentType("application/pdf"); //设置文件格式 response.setHeader("Content-disposition", "attachment;filename=" + fileName);//设置文件名 response.setHeader("Content-Length", "102400");//设置文件大小 response.flushBuffer(); response.getOutputStream().write(bytes); //写文件到响应体重}或者采用另一种方式@RequestMapping(value = "/down2") public ResponseEntity<byte[]> pdfDownload(HttpServletRequest httpServletRequest, HttpServletResponse response) throws IOException { String path = "d:/c.pdf"; File file = new File(path); HttpHeaders httpHeaders = new HttpHeaders(); String fileName = file.getName();// 设置文件名 httpHeaders.setContentDispositionFormData("attachment", java.net.URLEncoder.encode(fileName, "UTF-8"));// 设置响应格式 httpHeaders.setContentType(MediaType.parseMediaType("application/pdf"));// 将file放在ResponseEntity中返回 return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), httpHeaders, HttpStatus.CREATED); }以下关于Response.ContentType 详细列表不同的ContentType 会影响客户端所看到的效果.默认的ContentType为 text/html也就是网页格式.代码如:<% response.ContentType ="text/html" %> <!--#i nclude virtual="/ContentType.html" -->显示的为网页,而<% response.ContentType ="text/plain" %> <!--#i nclude virtual="/sscript/ContentType.html" -->则会显示html原代码.以下为一些常用的 ContentTypeXML<% response.ContentType ="text/xml" %>GIF images<% response.ContentType ="image/gif" %> JPEG images<% response.ContentType ="image/jpeg" %> TIFF images<% response.ContentType ="image/tiff" %> <!--#i nclude virtual="/myimage.tiff" -->MICROSOFT WORD document<% response.ContentType ="application/msword" %> <!--#i nclude virtual="/myfile.doc" -->RTF document<% response.ContentType ="application/rtf" %> <!--#i nclude virtual="/myfile.rtf" -->MICROSOFT EXCEL document<% response.ContentType ="application/x-excel" %> <!--#i nclude virtual="/myfile.xls" -->MICROSOFT POWERPOINT document<% response.ContentType ="application/ms-powerpoint" %> <!--#i nclude virtual="/myfile.pff" -->PDF document<% response.ContentType ="application/pdf" %> <!--#i nclude virtual="/myfile.pdf" -->ZIP document<% response.ContentType ="application/zip" %> <!--#i nclude virtual="/myfile.zip" -->下面是更详细的ContentType'ez' => 'application/andrew-inset', 'hqx' => 'application/mac-binhex40', 'cpt' => 'application/mac-compactpro', 'doc' => 'application/msword', 'bin' => 'application/octet-stream', 'dms' => 'application/octet-stream', 'lha' => 'application/octet-stream', 'lzh' => 'application/octet-stream', 'exe' => 'application/octet-stream', 'class' => 'application/octet-stream', 'so' => 'application/octet-stream', 'dll' => 'application/octet-stream', 'oda' => 'application/oda', 'pdf' => 'application/pdf', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'ps' => 'application/postscript', 'smi' => 'application/smil', 'smil' => 'application/smil', 'mif' => 'application/vnd.mif', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', 'wbxml' => 'application/vnd.wap.wbxml', 'wmlc' => 'application/vnd.wap.wmlc', 'wmlsc' => 'application/vnd.wap.wmlscriptc', 'bcpio' => 'application/x-bcpio', 'vcd' => 'application/x-cdlink', 'pgn' => 'application/x-chess-pgn', 'cpio' => 'application/x-cpio', 'csh' => 'application/x-csh', 'dcr' => 'application/x-director', 'dir' => 'application/x-director', 'dxr' => 'application/x-director', 'dvi' => 'application/x-dvi', 'spl' => 'application/x-futuresplash', 'gtar' => 'application/x-gtar', 'hdf' => 'application/x-hdf', 'js' => 'application/x-javascript', 'skp' => 'application/x-koan', 'skd' => 'application/x-koan', 'skt' => 'application/x-koan', 'skm' => 'application/x-koan', 'latex' => 'application/x-latex', 'nc' => 'application/x-netcdf', 'cdf' => 'application/x-netcdf', 'sh' => 'application/x-sh', 'shar' => 'application/x-shar', 'swf' => 'application/x-shockwave-flash', 'sit' => 'application/x-stuffit', 'sv4cpio' => 'application/x-sv4cpio', 'sv4crc' => 'application/x-sv4crc', 'tar' => 'application/x-tar', 'tcl' => 'application/x-tcl', 'tex' => 'application/x-tex', 'texinfo' => 'application/x-texinfo', 'texi' => 'application/x-texinfo', 't' => 'application/x-troff', 'tr' => 'application/x-troff', 'roff' => 'application/x-troff', 'man' => 'application/x-troff-man', 'me' => 'application/x-troff-me', 'ms' => 'application/x-troff-ms', 'ustar' => 'application/x-ustar', 'src' => 'application/x-wais-source', 'xhtml' => 'application/xhtml+xml', 'xht' => 'application/xhtml+xml', 'zip' => 'application/zip', 'au' => 'audio/basic', 'snd' => 'audio/basic', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'kar' => 'audio/midi', 'mpga' => 'audio/mpeg', 'mp2' => 'audio/mpeg', 'mp3' => 'audio/mpeg', 'aif' => 'audio/x-aiff', 'aiff' => 'audio/x-aiff', 'aifc' => 'audio/x-aiff', 'm3u' => 'audio/x-mpegurl', 'ram' => 'audio/x-pn-realaudio', 'rm' => 'audio/x-pn-realaudio', 'rpm' => 'audio/x-pn-realaudio-plugin', 'ra' => 'audio/x-realaudio', 'wav' => 'audio/x-wav', 'pdb' => 'chemical/x-pdb', 'xyz' => 'chemical/x-xyz', 'bmp' => 'image/bmp', 'gif' => 'image/gif', 'ief' => 'image/ief', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'jpe' => 'image/jpeg', 'png' => 'image/png', 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'djvu' => 'image/vnd.djvu', 'djv' => 'image/vnd.djvu', 'wbmp' => 'image/vnd.wap.wbmp', 'ras' => 'image/x-cmu-raster', 'pnm' => 'image/x-portable-anymap', 'pbm' => 'image/x-portable-bitmap', 'pgm' => 'image/x-portable-graymap', 'ppm' => 'image/x-portable-pixmap', 'rgb' => 'image/x-rgb', 'xbm' => 'image/x-xbitmap', 'xpm' => 'image/x-xpixmap', 'xwd' => 'image/x-xwindowdump', 'igs' => 'model/iges', 'iges' => 'model/iges', 'msh' => 'model/mesh', 'mesh' => 'model/mesh', 'silo' => 'model/mesh', 'wrl' => 'model/vrml', 'vrml' => 'model/vrml', 'css' => 'text/css', 'html' => 'text/html', 'htm' => 'text/html', 'asc' => 'text/plain', 'txt' => 'text/plain', 'rtx' => 'text/richtext', 'rtf' => 'text/rtf', 'sgml' => 'text/sgml', 'sgm' => 'text/sgml', 'tsv' => 'text/tab-separated-values', 'wml' => 'text/vnd.wap.wml', 'wmls' => 'text/vnd.wap.wmlscript', 'etx' => 'text/x-setext', 'xsl' => 'text/xml', 'xml' => 'text/xml', 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpe' => 'video/mpeg', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', 'mxu' => 'video/vnd.mpegurl', 'avi' => 'video/x-msvideo', 'movie' => 'video/x-sgi-movie', 'ice' => 'x-conference/x-cooltalk'
封装的工具类,get下载调用downloadURL(url),post下载调用POSTMethod()import org.apache.commons.collections.MapUtils;import org.apache.commons.lang3.StringUtils;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.BufferedHttpEntity;import org.apache.http.entity.ByteArrayEntity;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import java.io.ByteArrayOutputStream;import java.util.*;/** * User: Cheng * Date: 2019/4/22 * Time: 17:33 * Description: No Description */public class PostUtil { /** * 以Post方法访问 * * @param url 请求地址 * @param argsMap 携带的参数 * @param content 内容 * @return String 返回结果 * @throws Exception */ public static byte[] POSTMethod(String url, Map<String, Object> argsMap, String content) throws Exception {// argsMap,content都可以带参,二选一 byte[] dataByte = null; HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); if (MapUtils.isNotEmpty(argsMap)) { //设置参数 UrlEncodedFormEntity encodedFormEntity = new UrlEncodedFormEntity(setHttpParams(argsMap), "UTF-8"); httpPost.setEntity(encodedFormEntity); } if (StringUtils.isNotEmpty(content)) { httpPost.setEntity(new ByteArrayEntity(content.getBytes())); } // 执行请求 HttpResponse httpResponse = httpClient.execute(httpPost); // 获取返回的数据 HttpEntity httpEntity = httpResponse.getEntity(); if (httpEntity != null) { byte[] responseBytes = getData(httpEntity); dataByte = responseBytes; httpPost.abort(); } //将字节数组转换成为字符串// String result = bytesToString(dataByte);// return result; return dataByte; } /** * 获取Entity中数据 * * @param httpEntity * @return * @throws Exception */ public static byte[] getData(HttpEntity httpEntity) throws Exception { BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(httpEntity); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); bufferedHttpEntity.writeTo(byteArrayOutputStream); byte[] responseBytes = byteArrayOutputStream.toByteArray(); return responseBytes; } /** * 设置HttpPost请求参数 * @param argsMap * @return BasicHttpParams */ private static List<BasicNameValuePair> setHttpParams(Map<String, Object> argsMap){ List<BasicNameValuePair> nameValuePairList = new ArrayList<BasicNameValuePair>(); //设置请求参数 if (argsMap!=null && !argsMap.isEmpty()) { Set<Map.Entry<String, Object>> set = argsMap.entrySet(); Iterator<Map.Entry<String, Object>> iterator = set.iterator(); while(iterator.hasNext()){ Map.Entry<String, Object> entry = iterator.next(); BasicNameValuePair basicNameValuePair = new BasicNameValuePair(entry.getKey(), entry.getValue().toString()); nameValuePairList.add(basicNameValuePair); } } return nameValuePairList; } public static byte[] downloadURL(String url) throws Exception { byte[] dataByte = null; HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); HttpResponse httpResponse = httpClient.execute(httpGet); HttpEntity entity = httpResponse.getEntity();//获取返回数据 if (entity != null) {// 根据entity创建BufferedHttpEntity与创建流对象 BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(entity); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// 将BufferedHttpEntity写到流中 bufferedHttpEntity.writeTo(byteArrayOutputStream);// 将流转换成byte[] byte[] responseBytes = byteArrayOutputStream.toByteArray(); dataByte = responseBytes; httpGet.abort(); //(终止)程序 } return dataByte; }}
pdf转base64参考百度经验:https://jingyan.baidu.com/article/59a015e3770f58f7948865eb.html图片/PDF转Base64首先了解下如何最简单转base64,这里用到jdk中的BASE64Encoder,其中byte[] bytes为字节数组的文件(下列代码中是图片) BASE64Encoder encoder = new BASE64Encoder();// encode、encodeBuffer均可,由于该方法转换的字符中含换行符// 因此使用replaceAll替换掉所有换行符 String encode1 = encoder.encodeBuffer(bytes).trim().replaceAll("\r\n",""); String encode2 = encoder.encode(bytes).trim().replaceAll("\r\n","");// 根据文件类型添加data:信息,例如下列是图片// PDF可写成data:application/pdf;base64 System.out.println("data:image/png;base64,"+encode2);如果上述byte[] bytes数组为pdf的话即添加data:application/pdf;base64前端HTML显示PDF可以用iframe引用实现<iframe src="data:application/pdf;base64,这里是base64主体内容" style="width:100%;height:100%"></iframe>如果引用base64图片则为<img src="data:image/png;base64,***************************************************"/>PDF转图片转Base64使用Free Spire.PDF for JAVA,官网:http://e-iceblue.cn/Downloads/Free-Spire-PDF-JAVA.htmlFree Spire.PDF for JAVA是一款完全免费的PDF Java组件,开发人员可以使用它在Java应用程序中进行创建PDF、读取PDF和保存PDF等操作,并且无需安装Adobe Acrobat。 //加载PDF文件 PdfDocument doc = new PdfDocument(); doc.loadFromFile("d:/pdf/test.pdf"); //保存PDF的每一页到图片 BufferedImage image; for (int i = 0; i < doc.getPages().getCount(); i++) { image = doc.saveAsImage(i); File file = new File(String.format("d:/pdf/ToImage-img-%d.png", i));//指定图片文件 ImageIO.write(image, "PNG", file);//写入图片到文件 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ImageIO.write(image, "png", outputStream);//也可将图片写入进流 byte[] bytes = outputStream.toByteArray();//将流转换成byte[]// 下述使用工具类来进行Base64编码 System.out.println("data:image/png;base64," + Base64Utils.encode(bytes)); } doc.close();Base64工具类public class Base64Utils { private static char[] base64EncodeChars = new char[] {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; private static byte[] base64DecodeChars = new byte[] {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1}; public static String encode(byte[] data) { StringBuffer sb = new StringBuffer(); int len = data.length; int i = 0; int b1, b2, b3; while (i < len) { b1 = data[i++] & 0xff; if (i == len) { sb.append(base64EncodeChars[b1 >>> 2]); sb.append(base64EncodeChars[(b1 & 0x3) << 4]); sb.append("=="); break; } b2 = data[i++] & 0xff; if (i == len) { sb.append(base64EncodeChars[b1 >>> 2]); sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); sb.append(base64EncodeChars[(b2 & 0x0f) << 2]); sb.append("="); break; } b3 = data[i++] & 0xff; sb.append(base64EncodeChars[b1 >>> 2]); sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]); sb.append(base64EncodeChars[b3 & 0x3f]); } return sb.toString(); } public static byte[] decode(String str) { try { return decodePrivate(str); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return new byte[] {}; } private static byte[] decodePrivate(String str) throws UnsupportedEncodingException { StringBuffer sb = new StringBuffer(); byte[] data = null; data = str.getBytes("US-ASCII"); int len = data.length; int i = 0; int b1, b2, b3, b4; while (i < len) { do { b1 = base64DecodeChars[data[i++]]; } while (i < len && b1 == -1); if (b1 == -1) break; do { b2 = base64DecodeChars[data[i++]]; } while (i < len && b2 == -1); if (b2 == -1) break; sb.append((char) ((b1 << 2) | ((b2 & 0x30) >>> 4))); do { b3 = data[i++]; if (b3 == 61) return sb.toString().getBytes("iso8859-1"); b3 = base64DecodeChars[b3]; } while (i < len && b3 == -1); if (b3 == -1) break; sb.append((char) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2))); do { b4 = data[i++]; if (b4 == 61) return sb.toString().getBytes("iso8859-1"); b4 = base64DecodeChars[b4]; } while (i < len && b4 == -1); if (b4 == -1) break; sb.append((char) (((b3 & 0x03) << 6) | b4)); } return sb.toString().getBytes("iso8859-1"); }}或者使用itext包效果一样,依赖如下:<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --><dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.12</version></dependency>代码如下:import com.itextpdf.text.pdf.PdfReader;import org.apache.pdfbox.pdmodel.PDDocument;import org.apache.pdfbox.rendering.PDFRenderer;import sun.misc.BASE64Encoder;import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.*;public class TEXT { public static void main(String[] args) throws IOException { String path = "D:/a.pdf"; File file = new File(path); BASE64Encoder encoder = new sun.misc.BASE64Encoder(); FileInputStream is=new FileInputStream(file); byte[] pdf=new byte[is.available()]; is.read(pdf); is.close(); PDDocument pdDocument = PDDocument.load(pdf); PDFRenderer renderer = new PDFRenderer(pdDocument); PdfReader reader = new PdfReader(pdf); int pageNum = reader.getNumberOfPages(); for (int j = 0; j < pageNum; j++) { BufferedImage image = renderer.renderImageWithDPI(j, 100); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(image, "png", baos); baos.flush(); byte[] imageInByte = baos.toByteArray(); String base64 = encoder.encode(imageInByte).trim().replaceAll("\r\n",""); baos.close(); System.out.println("data:image/png;base64,"+base64); } reader.close(); }}
常见的有nat123跟花生壳,除此之外还有哪些免费的或者价格低的服务呢。下面介绍几款其他的,废话不多说直接贴链接:http://www.ngrok.cc 为什么使用Sunny-Ngrok?提供免费内网穿透服务,免费服务器支持绑定自定义域名管理内网服务器,内网web进行演示快速开发微信程序和第三方支付平台调试本地WEB外网访问、本地开发微信、TCP端口转发本站新增FRP服务器,基于 FRP 实现https、udp转发无需任何配置,下载客户端之后直接一条命令让外网访问您的内网不再是距离https://echosite.2bdata.com https://www.echosite.cn到EchoSite官网注册测试域名2元每月,还算实惠。服务基本上免费 。简评:随便聊聊近期试收费的内网穿透花生壳 免费使用 1月1G流量 感觉有点不够用nat123 非80端口73元一年 不过80端口有免费的Sunny-Ngrok 免费限速128k 感觉用来连远程ssh还行 收费10元不贵 但开新端口又得10元EchoSite 开新端口 网址映射都3元 只是没免费的 相比上面的便宜点NATAPP 有免费 免费的可以连ssh 收费也基本10元每个
Unsupported major.minor version 52.0Exception in thread "main" java.lang.UnsupportedClassVersionError: jodd/http/HttpRequest : Unsupported major.minor version 52.0 at java.lang.ClassLoader.defineClass1(Native Method)上jar包jvm版本高于jdk编译器版本,替换成旧jar或者更换高版本jdkhttps://zhidao.baidu.com/question/757441798969760124.htmlNoClassDefFoundError - jodd / exception / UncheckedExceptionjodd-lagarto模块依赖于jodd-core缺少类的模块修改了jdk在环境变量中的路径怎么cmd中的jdk版本没有变把path路径下的jdk配置放在前面即可%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;