protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { if (req.getParameter("lsh") == null || req.getParameter("name") == null || req.getParameter("aaddr") == null) { throw new RuntimeException("Necessary Arg Missing"); } String lsh= req.getParameter("lsh"); String name= req.getParameter("name"); String addr= req.getParameter("addr"); String digest = "6f9ec32c2a08a5527f6932f9c9df90dfc1a0be85";//192.168.17.232:4300 String filename = lsh + "_" + name+ "_" + addr; String surfix = ".pdf"; String contentType = "application/octet-stream"; OutputStream out = null; try { String sql = "SELECT * FROM " + table + " WHERE name = " + name+ " AND addr = " + addr; JSONObject reqJson = new JSONObject(); reqJson.put("stmt", sql); JSONObject respJson = executeRequest(reqJson); if (respJson.getIntValue("code") == -1) { throw new RuntimeException("DonwloadInovice Error: Get digest from " + table + " occured error, please try later"); } JSONArray respArr = respJson.getJSONArray("msg"); JSONObject data = respArr.getJSONObject(0); digest = data.getString("pdfdigest");// To-do,这里须要确认digest在数据库中存储到哪一个字段了 InputStream is = downloadPdf(digest); resp.setHeader("Content-Type", contentType); resp.setHeader("Content-Transfer-Encoding", "binary"); resp.setHeader("Cache-Control","must-revalidate"); resp.setCharacterEncoding("UTF-8"); resp.setHeader("Content-Disposition", "attachment;filename=" + filename + surfix); int read = -1; byte[] bytes = new byte[1024]; out = resp.getOutputStream(); while((read = is.read(bytes)) != -1) { out.write(bytes, 0, read); } }catch (Exception e) { e.printStackTrace(); contentType = "text/html"; resp.setHeader("Content-Type", contentType); String err = "downloadInvoice occured err, err message:" + e.getMessage(); out.write(err.getBytes()); } finally { if (null != out) { out.close(); } } } private InputStream downloadPdf(String digest){ try { HttpGet get = new HttpGet(blobUri(digest)); CloseableHttpResponse response = httpClient.execute(get); InputStream is = response.getEntity().getContent(); return is; }catch (Exception e){ e.printStackTrace(); } return null; } private String blobResourceUri(String index, String digest) { return String.format(Locale.ENGLISH, "%s/%s", index, digest); } private String blobUri(String digest) { return String.format(Locale.ENGLISH, "http://%s:%s/_blobs/%s", url, port, blobResourceUri(pdfblob, digest)); } private JSONObject executeRequest(JSONObject jsonObject) { JSONObject respBO = new JSONObject(); String pdfurl = "http://" + url + ":" + port + "/_sql?pretty"; System.out.println(pdfurl); System.out.println(jsonObject); try { HttpPost httpPost = new HttpPost(pdfurl); HTTPResp resp = client.post(pdfurl, jsonObject); if (resp == null || resp.getRespCode(-1) != 200) { int errorCode = resp.getRespJson().getJSONObject("error").getIntValue("code"); String errorMsg = resp.getRespJson().getJSONObject("error").getString("message"); logger.error(" ----- execute failed :" + resp.getRespMsg()); respBO.put("code", -1); respBO.put("msg", resp.getRespMsg()); } else { logger.info(" ----- execute success"); JSONObject respJson = resp.getRespJson(); JSONArray respArray = reformatData(respJson); respBO.put("code", 0); respBO.put("msg", respArray); } }catch (Exception e) { e.printStackTrace(); logger.error(e.getMessage(), e); respBO.put("code", -1); respBO.put("msg", e.getMessage()); } return respBO; } private JSONArray reformatData(JSONObject arg) { JSONArray rows = arg.getJSONArray("rows"); JSONArray cols = arg.getJSONArray("cols"); JSONArray array = new JSONArray(); for (int i = 0; i < rows.size(); i++) { JSONArray arr = rows.getJSONArray(i); JSONObject one = new JSONObject(); for (int j = 0; j < arr.size(); j ++) { Object value = arr.get(j); String key = cols.getString(j); if (value == null) value = "null";//如果没有值,则赋值为null one.put(key, value); } array.add(one); } return array; }
若是下载的文件有问题,那多是上传的时候就有问题,能够经过在浏览器输入访问地址,看可否获取到相应的文件来检查,官网样例:html
sh$ curl -isS '127.0.0.1:4200/_blobs/myblobs/e5fa44f2b31c1fb553b6021e7360d07d5d91ff5e' HTTP/1.1 404 Not Found Content-Length: 0
官网地址:https://crate.io/docs/reference/blob.htmlsql
当你输入的digest和url时就能在浏览器上看到你的blob文件,若是看不到,那说明存储到cratedb的文件是有问题的数据库
提示:必定要确认存到cratedb的blob文件是可用的,不然白忙活了json