问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

spring+spring mvc+ hibernate框架里怎么实现图片的上传,下载,展示功能

发布网友 发布时间:2022-04-29 23:56

我来回答

2个回答

懂视网 时间:2022-04-30 04:17

20) NOT NULL AUTO_INCREMENT, `realName` varchar(36) DEFAULT NULL, `fileContent` mediumblob, `handId` bigint(20) DEFAULT NULL, `customerId` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `fk_id` (`handId`), CONSTRAINT `fk_id` FOREIGN KEY (`handId`) REFERENCES `handprocess` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `handprocess` ( `id` bigint(20) NOT NULL DEFAULT ‘0‘, `handTime` bigint(20) DEFAULT NULL, `handName` varchar(20) DEFAULT NULL, `reason` varchar(100) DEFAULT NULL, `annexStr` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

处理过程(handprocess)和附件表(annex)一对多关系,一条处理过程可以有多个附件

除了springmvc+hibernate+spring的jar,还需要

commons-fileupload-1.3.1.jar

commons-io-2.0.1.jar

数据库保存上传文件内容使用mediumblob类型

mysql保存数据库二进制文件使用blob类型,其大小如下

TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G

springmvc中需添加配置文件

<bean id="multipartResolver"
 class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
 <property name="maxUploadSize" value="10000000"></property> <!-- byte -->
 <property name="defaultEncoding" value="utf-8" />
 </bean>

其中maxUploadSizes的大小是上传文件大小,单位:字节

实体:

package com.h3c.zgc.upload;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
 * 附件 和处理过程多对一
 * @author GoodLuck
 *
 */
@Entity
@Table(name="annex",catalog="itac")
public class Annex {
 @Id
 @Column(name="id")
 private Long id;
 //上传文件的名称
 @Column(name="realName")
 private String realName;
 //上传文件的内容
 @Column(name="fileContent")
 private byte[] fileContent;
 //处理过程的id
 @Column(name="handId")
 private Long handId;
 //客户id
 @Column(name="customerId")
 private Long customerId;
 
 //getter and setter ...
 
 
}
package com.h3c.zgc.upload;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name="handprocess",catalog="itac")
public class HandProcess {
 
 @Id
 @Column(name="id")
 private Long id;
 @Column(name="handTime")
 private Long handTime;
 @Column(name="handName")
 private String handName;
 @Column(name="reason")
 private String reason;
 @Column(name="annexStr")
 private String annexStr;
 @Transient
 private String handTimeStr;
 
 //getter and setter ...
 
 
}

dao层

package com.h3c.zgc.upload;

import java.io.Serializable;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.transform.Transformers;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

@Repository
public class UploadDownDao extends HibernateDaoSupport{
 @Resource
 public void set(SessionFactory sessionFactory){
 this.setSessionFactory(sessionFactory);
 }
 
 public Session getSession(){
 return this.getSessionFactory().openSession();
 }
 /**
 * 获取附件id最大值
 */
 public Long getMaxIdOfAnnex(){
 List l = this.getHibernateTemplate().find("select max(id) from Annex");
 System.out.println(l);
 if(l!=null&&l.size()==1&&l.get(0)!=null){
  return (Long) l.get(0);
 }
 return 0L;
 }
 /**
 * 获取处理过程id最大值
 * @return
 */
 public Long getMaxIdOfHandProcess(){
 List l = this.getHibernateTemplate().find("select max(id) from HandProcess");
 System.out.println(l);
 if(l!=null&&l.size()==1&&l.get(0)!=null){
  return (Long) l.get(0);
 }
 return 0L;
 }
 /**
 * 保存附件
 * @param annex
 * @return
 */
 public Serializable saveAnnex(Annex annex){
 return this.getHibernateTemplate().save(annex);
 }
 /**
 * 保存处理过程
 * @param hp
 * @return
 */
 public Serializable saveHandProcess(HandProcess hp){
 return this.getHibernateTemplate().save(hp);
 }
 /**
 * 获取处理过程列表,左连接查询
 * @return
 */
 public List getHandProcessList(){//有没有可能没有附件,附件annex,处理过程handprocess
 SQLQuery query = this.getSession().createSQLQuery("select h.id handprocessId,h.annexStr annexStr,a.id annexId,a.realName realName,h.handTime handTime,h.handName handName,h.reason reason from handprocess h left join annex a on a.handId=h.id");
 query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
 List list = query.list();
 return list;
 }
 /**
 * 根据id获取附件信息
 * @param annexId
 * @return
 */
 public Annex getAnnexById(Long annexId){
 return this.getHibernateTemplate().get(Annex.class, annexId);
 }
 /**
 * 修改处理过程
 * @param hp
 */
 public void updateHandProcess(HandProcess hp){
 this.getHibernateTemplate().update(hp);
 }
}

service层

package com.h3c.zgc.upload;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.transaction.Transactional;

import org.springframework.stereotype.Service;

@Service
public class UploadDownService {

 @Resource
 private UploadDownDao uploadDownDao;
 
 public Long getMaxIdOfAnnex(){
 return this.uploadDownDao.getMaxIdOfAnnex();
 }
 public Long getMaxIdOfHandProcess(){
 return this.uploadDownDao.getMaxIdOfHandProcess();
 }
 @Transactional
 public Serializable saveAnnex(Annex annex){
 return this.uploadDownDao.saveAnnex(annex);
 }
 @Transactional
 public Serializable saveHandProcess(HandProcess hp){
 return this.uploadDownDao.saveHandProcess(hp);
 }
 public Annex getAnnexById(Long annexId){
 return this.uploadDownDao.getAnnexById(annexId);
 }
 public List<Map<String,Object>> getHandProcessList(){
 return this.uploadDownDao.getHandProcessList();
 }
 @Transactional
 public void updateHandProcess(HandProcess hp){
 this.uploadDownDao.updateHandProcess(hp);
 }
}

controller层

package com.h3c.zgc.upload;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

@Controller
public class UploadDownFileController {
 @Resource
 private UploadDownService uploadDownService;
 //单文件上传到数据库,MultipartFile中封装了上传文件的信息
 @RequestMapping("upload")
 public String upload(HandProcess hp, HttpServletRequest request,
  @RequestParam("uploadFile1") MultipartFile uploadFile1)
  throws IOException, ParseException {
 
 InputStream is = uploadFile1.getInputStream();
 byte[] buffer = this.inputStrean2ByteArr(is);
 /**
  * 保存处理过程信息
  */
 // get max id then ++1
 Long hpMaxId = this.uploadDownService.getMaxIdOfHandProcess();
 DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
 hp.setHandTime(df.parse(hp.getHandTimeStr()).getTime());
 hp.setId(hpMaxId + 1);
 //保存处理过程
 Serializable hpId = this.uploadDownService.saveHandProcess(hp);
 /**
  * 保存附件
  */
 Annex annex = new Annex();
 annex.setCustomerId(1L);
 annex.setHandId((Long) hpId);
 annex.setRealName(uploadFile1.getOriginalFilename());
 annex.setFileContent(buffer);
 //查找附件id最大值
 annex.setId(this.uploadDownService.getMaxIdOfAnnex() + 1);
 Serializable aid = this.uploadDownService.saveAnnex(annex);
 /**
  * 获取处理过程列表
  */
 List<Map<String, Object>> as = this.uploadDownService
  .getHandProcessList();
 for (Map<String, Object> map : as) {
  map.put("handTime", df.format(map.get("handTime")));
 }
 request.setAttribute("as", as);
 return "annex/annexList";
 }
 /**
 * 多文件上传
 * @param hp 处理过程
 * @param request
 * @param uploadFile1 上传文件
 * @return
 * @throws IOException
 * @throws ParseException
 */
 @RequestMapping("uploadOneMore")
 public String uploadOneMore(HandProcess hp, HttpServletRequest request,
  @RequestParam("uploadFile1") MultipartFile[] uploadFile1)
  throws IOException, ParseException {
 /**
  * 保存处理过程信息
  */
 // get max id then ++1
 Long hpMaxId = this.uploadDownService.getMaxIdOfHandProcess();
 DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
 hp.setHandTime(df.parse(hp.getHandTimeStr()).getTime());
 hp.setId(hpMaxId + 1);
 //
 Serializable hpId = this.uploadDownService.saveHandProcess(hp);
 //保存改工单下的所有附件
 for (int i = 0; i < uploadFile1.length; i++) {
  InputStream is = uploadFile1[i].getInputStream();
  byte[] buffer = this.inputStrean2ByteArr(is);

  /**
  * 保存附件
  */
  Annex annex = new Annex();
  annex.setCustomerId(1L);
  annex.setHandId((Long) hpId);
  annex.setRealName(uploadFile1[i].getOriginalFilename());
  annex.setFileContent(buffer);
  annex.setId(this.uploadDownService.getMaxIdOfAnnex() + 1);
  Serializable annexId = this.uploadDownService.saveAnnex(annex);
  
 }
 //多文件上传,一个处理过程下面要有多个附件,在页面中显示的时候,一个处理过程后面要显示多个附件
 //更新表handprocess
 this.uploadDownService.updateHandProcess(hp);
 
 List<Map<String, Object>> as = this.uploadDownService
  .getHandProcessList();
 request.setAttribute("as", as);
 return "annex/annexList";
 }
 
 /**
 * 文件下载
 * @param response
 * @param annexId
 * @throws IOException
 */
 @RequestMapping("download")
 public void download(HttpServletResponse response, Long annexId)
  throws IOException {
 Annex a = this.uploadDownService.getAnnexById(annexId);
 byte[] b = a.getFileContent();
 response.setContentType("application/octet-stream;charset=UTF-8");
 response.setCharacterEncoding("utf-8");
 response.setHeader("Content-Disposition",
  "attachment;filename=" + new String(a.getRealName().getBytes("gbk"),"iso-8859-1")); //防止文件乱码

 BufferedOutputStream bos = new BufferedOutputStream(
  response.getOutputStream());
 bos.write(b);
 bos.close();
 }
 /**
 * inputstream转成byte数组
 * @param inStream
 * @return
 * @throws IOException
 */
 public byte[] inputStrean2ByteArr(InputStream inStream) throws IOException {
 ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
 byte[] buff = new byte[100];
 int rc = 0;
 while ((rc = inStream.read(buff, 0, 100)) > 0) {
  swapStream.write(buff, 0, rc);
 }
 byte[] in2b = swapStream.toByteArray();
 return in2b;
 }

}

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="${pageContext.request.contextPath }/resources/js/jquery-1.11.1.js"></script>
</head>
<body>
<a href="${pageContext.request.contextPath }/getAllStudent">查找所有用户</a>
<a href="${pageContext.request.contextPath }/savePerson">单独保存Person</a>
<a href="${pageContext.request.contextPath }/savePersonHouse">保存Person和House</a>
<br/>
<form action="${pageContext.request.contextPath }/getArr" >
 <input type="text" name="workSheetId"/><br/>
 <input type="submit" value="search"/>
</form>
<br/><br/><br/> 
<form action="<c:url value="/upload"/>" method="post" enctype="multipart/form-data">
 处理时间:<input type="text" name="handTimeStr"/><br>
 处理人:<input type="text" name="handName"/><br/>
 原因:<input type="text" name="reason"/><br/>
 选择文件:<input type="file" name="uploadFile1"/><br/>
 <input type="submit" value="submit"/>
</form>
<br/>
upload one more
<form action="<c:url value="/uploadOneMore"/>" method="post" enctype="multipart/form-data">
 处理时间:<input type="text" name="handTimeStr"/><br>
 处理人:<input type="text" name="handName"/><br/>
 原因:<input type="text" name="reason"/><br/>
 选择文件:<input type="file" name="uploadFile1"/><br/>
 选择文件:<input type="file" name="uploadFile1"/><br/>
 选择文件:<input type="file" name="uploadFile1"/><br/>
 <input type="submit" value="submit"/>
</form>
</body>
</html>

annexList.jsp  显示处理过程已经处理过程下附件

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript"
 src="${pageContext.request.contextPath }/resources/js/jquery-1.11.1.js"></script>
</head>
<body>
 <table>
 <c:forEach items="${as }" var="ah" varStatus="status">
  <tr>
  <td>${ah[‘handprocessId‘] }</td>
  <td>${ah[‘handName‘] }</td>
  <td>${ah[‘reason‘] }</td>
  <td id="id${status.index }">${ah[‘handTime‘] }</td>
  
  <td>
   ${ah[‘annex‘][‘realName‘] }
   <a href="<c:url value="/download?annexId=${ah[‘annexId‘] }"/>">${ah[‘realName‘] }</a>
  </td>
  </tr>
 </c:forEach>


 </table>
</body>
<script type="text/javascript">
 
</script>
</html>

 

springMVC+spring+hibernate注解上传文件到数据库,下载,多文件上传

标签:

热心网友 时间:2022-04-30 01:25

这个嘛 只和SpringMVC有点关系。 前端提交的文件,由springmvc拦截进行处理。
您可以使用上传插件。比如百度上传插件:Web Uploader。
怎么用的话,官网有Demo。也有API文档,可以自行查阅。
当然不用插件的话,也可以自己做个简单的,用Form表单提交到后台,后台对文件进行保存,展示的话直接用<img src='xxx路径'>。您可以自己组织语言百度搜索一下代码怎么写。
上传文件实际上就是传输一些数据到后台,然后使用java把这些数据保存到硬盘上,前端直接根据路径来进行访问。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
太和县环球嘉年华港口有限公司怎么样? 为什么抵触相亲? 鸡蛋怎么做好吃家常做法大全 为何抵触相亲 为什么很多人都抵触相亲? 鸡蛋怎么做才营养好吃呢? 怎么可以搞到110电话打过去给别人 植发后能保持多久?有人知道吗? 银联储蓄卡包括什么 怎么让电脑图标变小如何将电脑桌面上软件变小 怎么样能把眼线画的好看 东莞农商银行储蓄卡转账显示银行卡状态异常 QQ群主退出群后,谁来管理,没有管理员,群会怎样? 义乌农商银行银行卡异常 农商银行账户异常怎么解除 社保卡金融账户激活后原来工资卡内资金会自动转进社保卡里吗? - 信息提示 激活新医保卡后旧医保卡还能用吗旧医保卡的余额怎么办? 新社保卡激活后老卡的钱自动转入吗 没买东西却总是收到空包裹淘宝投诉电话打不通该怎样办求各位高手解救 淘宝投诉卖家怎么投诉?投诉电话多少?投诉有用吗 梦见弟弟死了还给我.寄了888元钱 办理个体营业执照流程 三星I997手机扬声器声音很小沙哑,插上耳机也是同样的问题。 三星手机扬声器有杂音 三星S3手机喇叭声音嘶哑,其它功能都正常,可换了喇叭就彻底没声音了,是什么地方的问题? 三星手机新买的时候,调到最大声听筒有沙哑声音是否正常,用久了之后是否回复正常 三星手机喇叭有杂音回声,怎么办? 三星手机喇叭有杂音该怎么办 电信手机怎么关掉电信卡的网速显示? 现在做网站关键词排名用什么软件免费且安全? f426卫衣怎么看真假 donsmoke卫衣如何判断真假? nasa卫衣怎么看真假 想问一下北京有关键词搜索排名的优化软件吗,要提升网站排名。 怎样分辨jicheng卫衣真假 关键词排名提升工具是什么? gap卫衣made in usa 正常的吗 快速刷关键词排名工具哪家好 如何辨别阿迪达斯卫衣的真假 生育保险试管能报销吗 生第三胎生育险可以报销吗 生育险什么不能报销生育险 怎样在下载的PDF文件上做修改? 怎样能在PDF文件上做修改 笔记本USB接口突然不能用了,怎么办,急! 冬瓜茶都有那些牌子 冬瓜茶饮料好 还是王老吉好 军训期间喝什么饮料比较好? 三星一体机555P 白纸进白纸出是什么部件有问题?