分享一个阿里云函数计算的java应用。
服务的功能是获取OSS中PPT模板,加载OSS中图片文件,合成PPT导出文件后,把文件回传到OSS方便下载的应用。
移植到函数计算的目的是OSS文件都在阿里云中,服务器迁移到了腾讯云,让代码更靠近数据,方便计算。
MAVEN配置里的build这块比较重要,把关联jar都会打包到一个jar中,这样才能上传到函数计算服务中。
1 <build> 2 <plugins> 3 <plugin> 4 <artifactId>maven-assembly-plugin</artifactId> 5 <version>3.1.0</version> 6 <configuration> 7 <descriptorRefs> 8 <descriptorRef>jar-with-dependencies</descriptorRef> 9 </descriptorRefs> 10 <appendAssemblyId>false</appendAssemblyId> <!-- this is used for not append id to the jar name --> 11 </configuration> 12 <executions> 13 <execution> 14 <id>make-assembly</id> <!-- this is used for inheritance merges --> 15 <phase>package</phase> <!-- bind to the packaging phase --> 16 <goals> 17 <goal>single</goal> 18 </goals> 19 </execution> 20 </executions> 21 </plugin> 22 <plugin> 23 <groupId>org.apache.maven.plugins</groupId> 24 <artifactId>maven-compiler-plugin</artifactId> 25 <configuration> 26 <source>1.8</source> 27 <target>1.8</target> 28 </configuration> 29 </plugin> 30 </plugins> 31 </build>
1 package example; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.OutputStream; 9 import java.net.URLDecoder; 10 import java.util.List; 11 import java.util.Map; 12 13 import javax.servlet.ServletException; 14 import javax.servlet.http.HttpServletRequest; 15 import javax.servlet.http.HttpServletResponse; 16 17 import org.apache.commons.io.FileUtils; 18 import org.apache.commons.lang3.StringUtils; 19 import org.apache.poi.xslf.usermodel.XMLSlideShow; 20 21 import com.alibaba.fastjson.JSON; 22 import com.alibaba.fastjson.JSONObject; 23 import com.aliyun.fc.runtime.Context; 24 import com.aliyun.fc.runtime.FunctionComputeLogger; 25 import com.aliyun.fc.runtime.HttpRequestHandler; 26 27 public class App2 implements HttpRequestHandler { 28 29 /** 30 * 模板默认的可变化的起始页,从这页开始插入生成的PPT 31 */ 32 public static final String FIELD_FLAG = "#"; 33 34 private static final Map<String, String> POINT_MAP = BizConstants.getInnerAttributeMap(); 35 36 private FunctionComputeLogger logger; 37 38 private String getV(HttpServletRequest request, String key) { 39 return (String)request.getAttribute(key); 40 } 41 42 /** 43 * 获取body中的内容 44 * 45 * @param request 46 * @return 47 */ 48 private String getBody(HttpServletRequest request) { 49 BufferedReader br; 50 try { 51 br = request.getReader(); 52 String str, wholeStr = ""; 53 while ((str = br.readLine()) != null) { 54 wholeStr += str; 55 } 56 wholeStr = URLDecoder.decode(wholeStr, "utf-8"); 57 return wholeStr; 58 } catch (IOException e) { 59 e.printStackTrace(); 60 } 61 return null; 62 } 63 64 public void handleRequest(HttpServletRequest request, HttpServletResponse response, Context context) 65 throws IOException, ServletException { 66 67 logger = context.getLogger(); 68 69 70 /** 71 * 获取客户端提交的BODY部分数据 72 */ 73 String body = getBody(request); 74 75 logger.info("body=====>" + body); 76 77 /** 78 * 解析JSON对象 79 */ 80 JSONObject obj = JSON.parseObject(body); 81 82 Integer pageSize = obj.getInteger("pageSize"); 83 String pptUrl = obj.getString("pptUrl"); 84 String pointsJson = obj.getString("points"); 85 String downloadName = obj.getString("downloadName"); 86 logger.info("pageSize=====>" + pageSize); 87 logger.info("pptUrl=====>" + pptUrl); 88 logger.info("downloadName=====>" + downloadName); 89 List<Point> points = JSON.parseArray(pointsJson, Point.class); 90 logger.info("points==size===>" + points.size()); 91 92 String filePath = saveExportPpt(points, pageSize, pptUrl); 93 94 logger.info("filePath==========>{}" + filePath); 95 96 String url = ""; 97 /** 98 * 上传生成好的PPT文件到OSS中 99 * 方便用户下载 100 */ 101 if (StringUtils.isNotBlank(filePath)) { 102 url = OssUtils.saveTempFile(filePath, downloadName); 103 } 104 logger.info("saveTempFile===url==>" + url); 105 106 response.setStatus(200); 107 OutputStream out = response.getOutputStream(); 108 out.write(url.getBytes()); 109 out.flush(); 110 out.close(); 111 } 112 113 114 115 /** 116 业务代码,生成PPT文件 117 */ 118 public String saveExportPpt(List<Point> points, Integer pageSize, String pptUrl) { 119 try { 120 File file = File.createTempFile(System.nanoTime() + "", ".pptx"); 121 String absolutePath = file.getAbsolutePath(); 122 logger.info("file=====length===>" + file.length()); 123 return absolutePath; 124 } catch (Exception e) { 125 logger.info("Exception" + e.toString()); 126 } 127 return null; 128 } 129 130 /** 131 * 从OSS获取PPT模板,生成PPT模板类 132 * @param pptUrl 133 * @return 134 */ 135 private XMLSlideShow getSlideShow(String pptUrl) { 136 File pptFile = null; 137 try { 138 pptFile = File.createTempFile(System.nanoTime() + ".", StringUtils.substringAfterLast(pptUrl, ".")); 139 140 /** 141 * 通过OSS SDK获取模板文件到函数计算服务器 142 */ 143 OssUtils.getImage(pptUrl, pptFile); 144 145 logger.info("pptFile==getAbsolutePath===>" + pptFile.getAbsolutePath()); 146 logger.info("pptFile==exists===>" + pptFile.exists()); 147 logger.info("pptFile==length===>" + pptFile.length()); 148 149 } catch (Exception e) { 150 e.printStackTrace(); 151 } 152 if (pptFile == null || !pptFile.exists()) { 153 return null; 154 } 155 try { 156 InputStream is = new FileInputStream(pptFile); 157 XMLSlideShow slideShow = new XMLSlideShow(is); 158 is.close(); 159 return slideShow; 160 } catch (Exception e1) { 161 162 } 163 return null; 164 } 165 166 /** 167 * 通过OSS SDK获取PPT中需要添加的图片到函数计算服务器本地 168 */ 169 private byte[] getImage(String imageUrl) { 170 try { 171 File destFile = File.createTempFile("temp", "." + StringUtils.substringAfterLast(imageUrl, ".")); 172 OssUtils.getImage(imageUrl, destFile); 173 byte[] pictureData = FileUtils.readFileToByteArray(destFile); 174 destFile.deleteOnExit(); 175 return pictureData; 176 } catch (Exception e) { 177 return null; 178 } 179 } 180 181 }
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java代码在阿里云函数计算中的应用 - Python技术站