虽然我不知道如何回答。
但我想附和一下,我也是把图片存数据库的。
我现在的项目是个测试性项目,不是正规使用。
我们的数据库供所有开发人员同时使用的。
不同的开发人员有不同的功能,功能互不干涉,但是共用一个数据库和表。
如果图片存在服务器本地,数据库只存图片名称,那大家各自在测试时都拿不到图片。
所以我把图片转成 Base64 字符串存进数据库了。
还有的表里存着 Blob 类型的用户上传的附件(文件或图片)。
一直看到大家说大文件不应该存数据库,
也许未来转为生产环境时候再改吧。
如果数据库存着 Base64 字符串,往前端发送应该比较简单了吧。
Blob 我看到我们的这边用的是,
(代码风格很渣,随便接受 Critics )
/***** Student Chose One Application*****/
@
RequestMapping(value="/history/{ticketNum}", method=RequestMethod.GET)
public String historyApplication(@PathVariable String ticketNum, Model model, HttpServletRequest request) {
String search = (String) request.getSession().getAttribute("searchTicketNum");
Optional<Application> app = applicationService.findApplication(ticketNum);
if (app.isPresent()) {
model.addAttribute("applicationObj", app.get());
Optional<User> user = AIBTuserdetailsService.findByUserName(app.get().getCreatedBy());
model.addAttribute("userObj",user.get());
model.addAttribute("urlTicketNum", ticketNum);
model.addAttribute("documents", applicationService.getDocumentUrl(ticketNum, app.get().getId()));
--------------------------------------------------------------------------------------------------
//调用 blob 类型的文件
model.addAttribute("logs", applicationService.getAuditLog(app.get().getId()));
//Optional<Course> course = courseService.findByCourseid(user.get().getCurrentCourseCode());
//if(course.isPresent()) {
// model.addAttribute("course", course.get().getCourseName());}
//else {
// model.addAttribute("course", "Not found");
//}
}
model.addAttribute("applicationList", applicationService.findApplications(search));
return "student/history";
}
In ApplicationService.java
public Map<String, String> getDocumentUrl(String ticketNum, int applicationId) {
Map<String, String> result = new HashMap<>();
for (String fileName : documentRepository.findAllFileNameByApplicationId(applicationId)) {
---------------------------------------------------------------------------------
//get document out from Database
if (!fileName.isEmpty()) {
try {
result.put(fileName, ticketNum + "/" + URLEncoder.encode(fileName, String.valueOf(StandardCharsets.UTF_8)));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
if (result.isEmpty()) {
return null;
} else {
return result;
}
}
In DocumentRepository.java
public interface DocumentRepository extends JpaRepository<Document, Integer> {
Optional<Document> findByFileNameAndApplicationId(String fileName, int applicationId);
@
Query(value="select file_name from document where application_id =:application_id", nativeQuery=true)
List<String> findAllFileNameByApplicationId(@Param("application_id") int applicationId);
}
//This is parts of Class Document
@
Entity@
Table(name = "Document")
public class Document {
@
Id @
GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private int applicationId;
private String fileName;
private String fileType;
@
Lob private byte[] data;
...
}
仅供参考
这个流程似乎就是前面一些 V 友说的以文件下载方式传到前端的。
前端是这样的:
<div class="three">
<p>
<b>Attachment:</b>
</p>
<div class="links">
<a target="_blank" th:each="element : ${documents}"
th:href="@{/student/downloadFile/{url}(url=${element.value})}"><img th:src="@{/image/qubiezhen.png}">[[${element.key}]]</a>
</div>
</div>