java图片上传到数据库

#要层次清晰,bean、dao、service、controller、mybatis,按照这样分层来做商品的新增(有商品id,商品名称,商品图片),我是用myeclipse开发工具,你们可以用form表单提交,也可以用ajax提交

9个回答

系统环境搭建就不说了,大致说下代码吧,前提你那个商城系统运行的起来

mysql建张表 t_goods_pic
字段:
id varchar(100) 主键
name varchar(100)

pic longblob --这里存头像图片文件的二进制流,使用longblob类型
对应字段初始化一条记录:good1,我是商品1,null

model:com.xProgram.manage.model.TGoodsPic

package com.xProgram.manage.model;

public class TGoodsPic {
    private String id;

    private String name;

    private byte[] pic;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id == null ? null : id.trim();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public byte[] getPic() {
        return pic;
    }

    public void setPic(byte[] pic) {
        this.pic = pic;
    }
}

mapper:com.xProgram.manage.mapper.TGoodsPicMapper
主要用到最后两个接口,这里可以称为dao层,只不过用的mybatis实现

package com.xProgram.manage.mapper;
import org.apache.ibatis.annotations.Param;
import com.xProgram.manage.model.TGoodsPic;
public interface TGoodsPicMapper {
    int insert(TGoodsPic record);

    int insertSelective(TGoodsPic record);

    int updateGoods(TGoodsPic record);

    TGoodsPic selectAllGoodsById(@Param(value="id")String id);
}

mapping:com.xProgram.manage.mapping.TGoodsPicMapper.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xProgram.manage.mapper.TGoodsPicMapper">
  <resultMap id="BaseResultMap" type="com.xProgram.manage.model.TGoodsPic">
    <result column="ID" jdbcType="VARCHAR" property="id" />
    <result column="NAME" jdbcType="VARCHAR" property="name" />
  </resultMap>
  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="com.xProgram.manage.model.TGoodsPic">
    <result column="PIC" jdbcType="LONGVARBINARY" property="pic" />
  </resultMap>

  <sql id="Blob_Column_List">
    PIC
  </sql>
  <insert id="insert" parameterType="com.xProgram.manage.model.TGoodsPic">
    insert into t_goods_pic (ID, NAME, PIC
      )
    values (#{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{pic,jdbcType=LONGVARBINARY}
      )
  </insert>
  <insert id="insertSelective" parameterType="com.xProgram.manage.model.TGoodsPic">
    insert into t_goods_pic
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        ID,
      </if>
      <if test="name != null">
        NAME,
      </if>
      <if test="pic != null">
        PIC,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=VARCHAR},
      </if>
      <if test="name != null">
        #{name,jdbcType=VARCHAR},
      </if>
      <if test="pic != null">
        #{pic,jdbcType=LONGVARBINARY},
      </if>
    </trim>
  </insert>

  <update id="updateGoods" parameterType="com.xProgram.manage.model.TGoodsPic">
        update t_goods_pic
        <set>
            <if test="name != null">
                name=#{name,jdbcType=VARCHAR},
            </if>
            <if test="pic != null">
                pic=#{pic,jdbcType=LONGVARBINARY},
            </if>
        </set>
        where id = #{id,jdbcType=VARCHAR}
    </update>

    <select id="selectAllGoodsById" resultMap="BaseResultMap" useCache="false">
         select 
         id,name,pic 
         from t_goods_pic
         <where>
            id=#{id,jdbcType=VARCHAR}
         </where>
    </select>
</mapper>

service:com.xProgram.manage.service.TGoodsPicService
服务层接口

package com.xProgram.manage.service;

import org.apache.ibatis.annotations.Param;

import com.xProgram.manage.model.TGoodsPic;

public interface TGoodsPicService {
    int insert(TGoodsPic record);

    int insertSelective(TGoodsPic record);

    int updateGoods(TGoodsPic record);

    TGoodsPic selectAllGoodsById(@Param(value="id")String id);
}

serviceImpl:com.xProgram.manage.serviceImpl.TGoodsPicServiceImpl
注意开始有注解了@Service("tgoodspicService"),dao层与service层建立关系

package com.xProgram.manage.serviceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.xProgram.manage.mapper.TGoodsPicMapper;
import com.xProgram.manage.model.TGoodsPic;
import com.xProgram.manage.service.TGoodsPicService;

@Service("tgoodspicService")
public class TGoodsPicServiceImpl implements TGoodsPicService{

    private TGoodsPicMapper tgoodspicMapper;

    public TGoodsPicMapper getTgoodspicMapper() {
        return tgoodspicMapper;
    }

    @Autowired
    public void setTgoodspicMapper(TGoodsPicMapper tgoodspicMapper) {
        this.tgoodspicMapper = tgoodspicMapper;
    }
    @Override
    public int insert(TGoodsPic record) {
        return 0;
    }

    @Override
    public int insertSelective(TGoodsPic record) {
        return 0;
    }

    @Override
    public int updateGoods(TGoodsPic record) {
        return tgoodspicMapper.updateGoods(record);
    }

    @Override
    public TGoodsPic selectAllGoodsById(String id) {
        return tgoodspicMapper.selectAllGoodsById(id);
    }

}

controller:com.xProgram.manage.controller.TGoodsPicController
控制层,全靠注解
@Controller
@RequestMapping("/tgoodspicService") 注解在类上
@RequestMapping(value="/uploadPic") 注解在方法上
访问指定方法:/tgoodspicService/uploadPic.do?param=xxx

package com.xProgram.manage.controller;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.xProgram.manage.model.TGoodsPic;
import com.xProgram.manage.service.TGoodsPicService;

@Controller
@RequestMapping("/tgoodspicService")
public class TGoodsPicController {

    private TGoodsPicService tgoodspicService;

    public TGoodsPicService getTgoodspicService() {
        return tgoodspicService;
    }
    @Autowired
    public void setTgoodspicService(TGoodsPicService tgoodspicService) {
        this.tgoodspicService = tgoodspicService;
    }

    /**
     * 上传头像
     * @param request
     * @return
     */
    @RequestMapping(value="/uploadPic")
    public void  uploadPic(HttpServletRequest request,HttpServletResponse response) {

        String filePath = request.getParameter("filepath");//前端传递过来的上传路劲
        String goodid =  request.getParameter("goodid");//前端传递过来的id

        TGoodsPic good = new TGoodsPic();
        good.setId(goodid);
        good.setName("我是商品1");
        byte []pic=null;
        try{
                    //通过下面代码把文件转成byte直接存储就行
            File file=new File(filePath);
            InputStream inputStream=new FileInputStream(file);
            pic=new byte[inputStream.available()];
            inputStream.read(pic);
            inputStream.close();
            good.setPic(pic);

            tgoodspicService.updateGoods(good);//头像存库
                  response.getWriter().write("success");
                response.getWriter().flush();
        }catch(Exception e){
            e.printStackTrace();
        }
    }


    /**
     * 获取头像
     * @param request
     * @return
     */
    @RequestMapping(value="/getGoodsPic")
    public void   getGoodsPic(HttpServletRequest request,HttpServletResponse response){ 
        response.setHeader("Content-Type","image/jped");//设置响应的媒体类型,这样浏览器会识别出响应的是图片
        String goodid = request.getParameter("goodid");
        TGoodsPic good = tgoodspicService.selectAllGoodsById(goodid);
        try {
            response.getOutputStream().write(good.getPic());//流输出
            response.getOutputStream().flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

前端:login.html

 <div class="modal-footer">
    <div id="message1" class="pull-left message">
        <input  name="file1" type="file" value="选择" size="50" style="line-height: 18px;" height="18px" id="fileUpload1">
    </div>
    <button type="button" class="btn btn-primary" onclick="uploadpic();">&nbsp;上传头像&nbsp;</button>
</div>

js操作

//上传头像
function uploadpic(){
    var filepath = $("#fileUpload1").val();
    //商品id,数据库写死记录
    var goodid = "good1";
    if(filepath == ""|| filepath==null){
        return;
    }
    jQuery.ajax({
        type: 'post',
        url: "tgoodspicService/uploadPic.do",
        async: false,
        cache: false,
            contentType:'application/x-www-form-urlencoded; charset=UTF-8',
            data: {"goodid":goodid,"filepath":filepath},
            success: function (data) {
                //头像存库后再读取出来响应到img标签
                showPic(goodid);
            }
    });
}

//展示头像
function showPic(goodid){
 //img标签src属性支持流输出,后面要给上随机参数,预防读缓存
    $(".img_").attr("src","tgoodspicService/getGoodsPic.do?goodid="+goodid+"&mas="+Math.random());
}

web.xml :对/tgoodspicService开放拦截,不登录也能演示

<filter>
        <filter-name>SessionFilter</filter-name>
        <filter-class>com.xProgram.manage.filter.IsLoginFilter</filter-class>
        <init-param>
            <param-name>loginStrings</param-name><!-- 对登录页面不进行过滤 -->
            <param-value>/login.html;/seller;/register;version.html;/test;/inswept;/tgoodspicService</param-value>
        </init-param>
        <init-param>
            <param-name>includeStrings</param-name><!-- 只对指定过滤参数后缀进行过滤 -->
            <param-value>.html;.jsp;.do</param-value>
        </init-param>
        <init-param>
            <param-name>redirectPath</param-name><!-- 未通过跳转到登录界面 -->
            <param-value>/login.html</param-value>
        </init-param>

    </filter>

效果:

图片说明

SetMyLife
千劫 真详细...\
2 年多之前 回复

我想说的是这种把图片转成二进制存入数据库的做法是不推荐的,不管你是初学者也好,尤其是系统大批量图片的情况下,会导致数据库维护问题
图片和二进制互转:https://www.cnblogs.com/remember-forget/p/6728628.html

上传和分层没有什么关系,在controller里处理,存入服务器就可以了。把上传的文件名、对应的商品通过service调用dao存入数据库,这个和一般的数据库插入没有什么区别。

lctyang123
lctyang123 我就是controller层不懂得写
2 年多之前 回复

楼主太懒了吧- -百度一堆啊,给你个地址:http://blog.csdn.net/weixin_36380516/article/details/58594664

niaonao
niaonao 回复lctyang123: 你准备用MVC模式,还是直接搞SSM框架
2 年多之前 回复
lctyang123
lctyang123 你没看明白我的意思,Servlet的做法我懂得,我要的是另一种分层的做法
2 年多之前 回复

bean、dao、service、controller、mybatis 这不是基本层次吗? 随便一搜都有,而且这个还用搜? 咋不回? 没学过? 学生? 这都是套路,随便找个教程代码就可以了。

lctyang123
lctyang123 回复砸死接触: 哦哦,我主要是controller那一层的代码,不知道要怎么写
2 年多之前 回复
qq_33727653
砸死接触 我的意思是你在这里问没有用,得到这种答案代码的几率很小,还是自己搜搜下下吧。比如mybatis教程 Spring教程什么的,会有代码的,有的是整个项目代码。当然楼主要找点简单的。
2 年多之前 回复
lctyang123
lctyang123 你会不代表别人会,我只是个初学者
2 年多之前 回复

如果是不会分层,可以先学一下mvc架构,注解或者xml映射,如果是不会存图片,就是在controlle方法里面得到图片路径再调用保存方法就可以了

wjf1993520
灯泡上的蚂蚁 回复lctyang123: http://blog.csdn.net/sutongxuevip/article/details/53929769
2 年多之前 回复
lctyang123
lctyang123 有这样的一个案例的源代码吗
2 年多之前 回复

看楼主要使用springmvc?
前台form或ajax提交 商品id,商品名称,商品图片
controller 接收 商品id,商品名称,商品图片 转 bean 图片流写到文件服务器 保存路径到 bean属性
controller中注入service 对象 进行业务处理
service中注入dao对象,进行mybatis入库操作

楼主要这个?

大致写一个给你

     @RequestMapping(value="/uploadfile")  
    public String upload1(@RequestParam("file") CommonsMultipartFile file) throws IOException{  
        String fileName = file.getOriginalFilename();  
        InputStream is = file.getInputStream();  
        byte[] bs = new byte[1024];  
        int len;  
        OutputStream os = new FileOutputStream(new File("D:/upload/" + fileName));  
        while ((len = is.read(bs)) != -1) {  
            os.write(bs, 0, len);  
        }  
        os.close();  
        is.close();  
        return "upload_success";  
    }  

一般的图片多的,建议一个ftp服务就行了,如果少点,可以传一个图片的id(主键),或者图片一些其他的属性,放到一个盘下面,读取的时候,图片的插件会自动定位到这个图片的;

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐