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;
}
如果下载的文件有问题,那可能是上传的时候就有问题,可以通过在浏览器输入访问地址,看能否获取到相应的文件来检查,官网样例:
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.html
当你输入的digest和url时就能在浏览器上看到你的blob文件,如果看不到,那说明存储到cratedb的文件是有问题的
提示:一定要确认存到cratedb的blob文件是可用的,否则白忙活了