这里写自定义目录标题
freemarker生成word上传minio
```JAVA
/**
* 上传文件
* @param prefix 文件前缀
* @param filename 文件名
* @param inputStream 文件流
* @return 文件全路径
*/
@Override
public String uploadFile(String prefix, String filename,InputStream inputStream) {
String filePath = builderFilePath(prefix, filename);
try {
PutObjectArgs putObjectArgs = PutObjectArgs.builder()
.object(filePath)
.contentType("text/doc")
.bucket(minIOConfigProperties.getBucket()).stream(inputStream,inputStream.available(),-1)
.build();
minioClient.putObject(putObjectArgs);
StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
urlPath.append(separator+minIOConfigProperties.getBucket());
urlPath.append(separator);
urlPath.append(filePath);
return urlPath.toString();
}catch (Exception ex){
log.error("minio put file error.",ex);
ex.printStackTrace();
throw new RuntimeException("上传文件失败");
}
}
@Test
public void testOut() throws IOException, TemplateException {
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("xytitle", "试卷");
dataMap.put("title_zhuanye","aaaa");
dataMap.put("title_course","aaasdsafasf");
Question asdas = new Question("asdas", "A adsda B adssadas c asdasd");
Question asdas2 = new Question("asdas", "A adsda B adssadas c asdasd");
Question asdas3 = new Question("asdas", "A adsda B adssadas c asdasd");
Question asdas4 = new Question("asdas", "A adsda B adssadas c asdasd");
ArrayList<Question> questionList = new ArrayList<>();
questionList.add(asdas);
questionList.add(asdas2);
questionList.add(asdas3);
questionList.add(asdas4);
dataMap.put("questionList", questionList);
configuration = new Configuration();
configuration.setClassForTemplateLoading(this.getClass(), "/templates");
//创建输出流,利用模块对象调用process方法,将数据按照模板转换成静态页面放到输出流中
StringWriter out = new StringWriter();
Template template = configuration.getTemplate("WordTemplate.ftl");
template.process(dataMap, out);
//将输出流转成输入流 就这一句
InputStream is = new ByteArrayInputStream(out.toString().getBytes());
String staticUrl = fileStorageService.uploadHtmlFile("", "test" + ".doc", is);
System.out.println(staticUrl);
}
freemark插入图片
首先在word上放置一个图片用来占位置
找到binaryData标签删除用来占位图片的base64编码
找到对应的Relationship Id 修改成你需要的id
最后修改<a:graphic 标签里的 <a:blip r:embed=“rId”/>
注意:这几个地方要保持id一致才能读取正确的图片。
因为我的图片存储到了minio 所以要写一个把minio里面的图片转成base64编码的函数.
public static String getBinByHttp(String src){
byte[] buffer = null;
InputStream inputStream = null;
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();){
// 创建URL
URL picurl = new URL(src);
// 创建链接
HttpURLConnection conn = (HttpURLConnection) picurl.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
inputStream = conn.getInputStream();
// 将内容读取内存中
buffer = new byte[1024];
int len = -1;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
buffer = outputStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
// 关闭inputStream流
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 对字节数组进行Base64编码
Base64.Encoder encode = Base64.getEncoder();
String code = encode.encodeToString(buffer);
return code;
}