springmvc+mybatis 处理图片(一):上传图片

一直觉得上传图片文件之类的很难,所以最后才处理图片,发现也并没有那么难,开始正文。

思路:将前台上传的file存到MutipartFile类型字段中,再将MulipartFile转换为pojo类中的byte[ ]数组,最后存入数据库longBlob类型字段中
1. 数据库设计,将图片newsPic字段类型设置为longblob或blob

2. 准备jar包:commons-fileupload和commons-io,我用的是commons-fileupload-1.3.1.jar和commons-io-2.4.jar,也可以在这里下载。 
3. 在springmvc-config.xml中进行上传文件的配置

<!-- 对上传文件的配置 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding">
        <value>UTF-8</value>
    </property>
    <property name="maxUploadSize">
        <value>32505856</value><!-- 上传文件大小限制为31M,31*1024*1024 -->
    </property>
    <property name="maxInMemorySize">
        <value>4096</value>
    </property>
</bean>

form表单里面有文件上传时,必须要指定enctype属性值为multipart/form-data,意思是以二进制流的形式传输文件。否则会报错上传不了。
而因为在form表单中增加了:enctype="multipart/form-data"这个属性,会将数据转换为二进制,导致接收到的值都为空值,因此要在spring的配置文件中配置multipartResolver
4. addNews.jsp

<form action="addNewst" method="post" enctype="multipart/form-data">
    <table>
        <tr>
            <td>
                <input type="file" size="50" name="newsPicture"/>
            </td>
        </tr>
        <!--省略其他字段的代码-->
    </table>
</form>

5. NewsMapper.java和NewsDynaSqlProvider.java
(1) NewsMapper.java

//动态插入新闻
@SelectProvider(type=NewsDynaSqlProvider.class,method="insertNews")
void save(News news);

(2) NewsDynaSqlProvider.java

//动态插入
public String insertNews(final News news){
    return new SQL(){
        {
            INSERT_INTO("news");
            if(news.getNewsTitle() != null && !news.getNewsTitle().equals("")){
                VALUES("newsTitle", "#{newsTitle}");
            }
            if(news.getNewsAbstract() != null && !news.getNewsAbstract().equals("")){
                VALUES("newsAbstract", "#{newsAbstract}");
            }
            if(news.getNewsAuthor() != null && !news.getNewsAuthor().equals("")){
                VALUES("newsAuthor", "#{newsAuthor}");
            }
            if(news.getNewsTime() != null && !news.getNewsTime().equals("")){
                VALUES("newsTime", "#{newsTime}");
            }
            if(news.getNewsContent() != null && !news.getNewsContent().equals("")){
                VALUES("newsContent", "#{newsContent}");
            }
            if(news.getNewsPic() != null && !news.getNewsPic().equals("")){
                VALUES("newsPic", "#{newsPic,jdbcType=BLOB}");
            }
        }
    }.toString();
}

6. TestService.java和TestServiceImpl.java
(1) TestService.java

/**
* 添加新闻
* @param News 新闻对象
* @MultipartFile newsPic 新闻图片
* @throws Exception 
*/
void addNewsAndPic(News news, MultipartFile newsPic) throws Exception;

(2) TestServiceImpl.java

@Override
public void addNewsAndPic(News news, MultipartFile newsPic) throws Exception {
    byte[] b1 = newsPic.getBytes();
    news.setNewsPic(b1);
    newsMapper.save(news);
}

7. NewsController.java

/**
 * 处理添加请求
 * @param String flag 标记, 1表示跳转到添加页面,2表示执行添加操作
 * @param News news  要添加的新闻对象
 * @param ModelAndView mv
 * @throws Exception 
 * */
@RequestMapping(value="/addNewst")
 public ModelAndView addNewst(String flag, @ModelAttribute News news, MultipartFile newsPicture, ModelAndView mv, HttpSession session) throws Exception{
     if(flag.equals("1")){
         mv.setViewName("addNews");
     }else{
         testService.addNewsAndPic(news, newsPicture);
         mv.setViewName("redirect:/htNews");
     }
     return mv;
 }

SpringMVC中从前台到后台通过表单传递数据:

(1) 表单的name属性值必须和接受的参数同名。否则,接收到的参数为null
(2) 表单的name属性值必须和接收对象的属性同名。否则,接收到的参数为null

8. News.java

public class News implements Serializable{
    private Integer newsID;
    private String newsTitle;
    private String newsAbstract;
    private String newsAuthor;
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date newsTime;
    private String newsContent;
    private byte[] newsPic;//新闻照片
    
    public News(){
        super();
    }
    //setter and getter
}

参考:https://blog.csdn.net/j277699931/article/details/50413864
二、.jsp改进,读取input:file的路径后,显示本地图片

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>title</title>
<style type="text/css">
#imagePreview {   
width: 160px;   
height: 120px;   
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale);   
}   
</style>
</head>
<body>
<form action="addNewst" id="newsForm" method="post" enctype="multipart/form-data">
    <table>
        <tr>
            <td>
                <div id="imagePreview"></div>
                <input id="imageInput" type="file" size="50" name="newsPicture" οnchange="loadImageFile()"/>
            </td>
        </tr>
        <!--省略其他代码-->
    </table>
</form>
<script type="text/javascript">
var loadImageFile = (function () {   
    if (window.FileReader) {   
    var oPreviewImg = null, oFReader = new window.FileReader(),   
    rFilter = /^(?:image\/bmp|image\/cis\-cod|image\/gif|image\/ief|image\/jpeg|image\/jpeg|image\/jpeg|image\/pipeg|image\/png|image\/svg\+xml|image\/tiff|image\/x\-cmu\-raster|image\/x\-cmx|image\/x\-icon|image\/x\-portable\-anymap|image\/x\-portable\-bitmap|image\/x\-portable\-graymap|image\/x\-portable\-pixmap|image\/x\-rgb|image\/x\-xbitmap|image\/x\-xpixmap|image\/x\-xwindowdump)$/i;   
      
      
    oFReader.onload = function (oFREvent) {   
    if (!oPreviewImg) {   
    var newPreview = document.getElementById("imagePreview");   
    oPreviewImg = new Image();   
    oPreviewImg.style.width = (newPreview.offsetWidth).toString() + "px";   
    oPreviewImg.style.height = (newPreview.offsetHeight).toString() + "px";   
    newPreview.appendChild(oPreviewImg);   
    }   
    oPreviewImg.src = oFREvent.target.result;   
    };   
      
      
    return function () {   
    var aFiles = document.getElementById("imageInput").files;   
    if (aFiles.length === 0) { return; }   
    if (!rFilter.test(aFiles[0].type)) { alert("You must select a valid image file!"); return; }   
    oFReader.readAsDataURL(aFiles[0]);   
    }   
      
      
    }   
    if (navigator.appName === "Microsoft Internet Explorer") {   
    return function () {   
    alert(document.getElementById("imageInput").value);   
    document.getElementById("imagePreview").filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = document.getElementById("imageInput").value;   
      
      
    }   
    }   
    })();   
</script>
</body>
</html>

效果如图:

参考:https://blog.csdn.net/dracotianlong/article/details/38046939

------------------------------------------------------分界线------------------------------------------------------------
遇到的错误:
1. SpringMVC表单提交后,Controller接收到的值都是null,如图


报错如下:

四月 13, 2018 10:43:33 上午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [springmvc] in context with path [/SpringDemo] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
at com.game.controller.NewsController.addNewst(NewsController.java:58)

原因:没有配置multipartResolver,参考:https://blog.csdn.net/MODjie/article/details/79076455

2. 点击”新闻管理“的界面,就在显示图片的controller中报空指针异常java.lang.NullPointerException,但是页面的所有功能都能正常使用,开始始终不明白怎么回事,后来发现是因为有的新闻没有添加图片,造成在加载页面获取新闻的二进制文件流时报空指针异常。

java.lang.NullPointerException
    at java.io.ByteArrayInputStream.<init>(ByteArrayInputStream.java:106)
    at com.game.controller.NewsController.newsPic(NewsController.java:105)

如图:

------------------------------------------------------分界线------------------------------------------------------------

Mysql中的BLOB数据类型
在计算机中,BLOB是数据库中经常用来存储二进制文件的字段类型,典型的BLOB是一张图片或一个声音文件。
MySQL中,BLOB是个类型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是存储文件的最大大小的不同。

类型大小(单位:字节)
TinyBlob最大 255
Blob最大 65K
MediumBlob最大 16M
LongBlob最大 4G

转载于:https://www.cnblogs.com/zeroingToOne/p/8824126.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值