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

怎么样在jsp页面上传图片?把图片的名字如1.jpg上传到数据库,把图片保存到一个制定的文件夹里面。

发布网友 发布时间:2022-04-08 10:06

我来回答

2个回答

懂视网 时间:2022-04-08 14:27

form name="form1" action="/YiQu/AddUserServlet?jurisdiction=1" method="post" enctype="multipart/form-data"> <table align="center"> <tr> <td>用户id:</td> <td><input type="text" name="userid" ></td> </tr> <tr> <td>用户名:</td> <td><input type="text" name="username" ></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="userpassword" ></td> </tr> <tr> <td>昵称:</td> <td><input type="text" name="usernickname" ></td> </tr> <tr> <td>头像:</td> <td><input type="file" name="userpicture" accept="image/*"></td> </tr> <tr> <td>个性签名:</td> <td><input type="text" name="userdescription" ></td> </tr> <tr> <td>mabeyuse:</td> <td><input type="text" name="mabeyuse" ></td> </tr> <tr> <td>生日:</td> <td><input type="date" name="userdate" ></td> </tr> <tr> <td>性别:</td> <td><input type="radio" name="usersex" value="男" checked>男       <input type="radio" name="usersex" value="女" >女</td> </tr> <tr> <td>地址:</td> <td><input type="text" name="useraddr" ></td> </tr> <tr> <td>邮箱:</td> <td><input type="text" name="usermail" ></td> </tr> <tr> <td>电话:</td> <td><input type="text" name="usertel" ></td> </tr> <tr> <td>支付宝:</td> <td><input type="text" name="useralipayid" ></td> </tr> <tr> <td>权限:</td> <td><input type="text" name="jurisdiction" ></td> </tr> <tr> <td></td> <td><input type="submit" value="添加"></td> </tr> </table> </form> </body>

我想要后台提取file标签上传的图片,然后存到mysql数据库,一开始我使用默认方式进行提交表单,发现只能获取file标签上传图片的名字,并不能获取图片内容,

那么我就要将表单以二进制流的形式进行提交,

表单默认:enctype="application/x-www-form-urlencoded",

我需要将它改为:enctype="multipart/form-data",这时候提交的表单就是二进制流数据,

既然是以数据流上传,那么后台request.getParameter("")获取不到数据,只有经过解析后获取标签内容,

这里要用到Apache的commons-fileupload.jar 然而这个jar包基于commons-io.jar ,所以要导入这两个jar包:

commons-fileupload.jar

commons-io.jar

导入之后编写后台接收servlet

我的servlet如下:

public class AddUserServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 private String savePath;
 private ServletContext sc;

 public void init(ServletConfig config) {
  savePath="upload";  // 项目下用于存放图片的文件夹
  sc = config.getServletContext(); // 获取上下文
 }
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 doPost(request, response);
 }

 /**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 request.setCharacterEncoding("utf-8");
 response.setCharacterEncoding("utf-8");
 response.setContentType("text/html;charset=utf-8");
 PrintWriter out = response.getWriter();
 Map<String, String> map=new HashMap<>();  // 用于存储表单非二进制流部分
 boolean isMultipart = ServletFileUpload.isMultipartContent(request);// 检查输入请求是否为multipart表单数据。
 if (isMultipart == true) { // 如果是二进制流形式的表单
  FileItemFactory factory = new DiskFileItemFactory();// 通过它来解析请求。执行解析后,所有的表单项目都保存在一个List中。
  ServletFileUpload upload = new ServletFileUpload(factory);
  List<FileItem> items = null;
  File savedFile=null;
  try {
  items = upload.parseRequest(request);
  } catch (FileUploadException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  Iterator<FileItem> itr = items.iterator();
  while (itr.hasNext()) {
  FileItem item = (FileItem) itr.next();
  
  if (item.isFormField()) {//检测是否为普通表单 如果是普通表单项目,将其名字与对应的value值放入map中。
   String fieldName = item.getFieldName();
   map.put(fieldName, item.getString("UTF-8"));//获取表单value时确定数据格式,如果不写,有中文的话会乱码
   
  } else { //如果是提交的图片
   File fullFile=new File(item.getName()); //获取提交的文件
   savedFile=new File(sc.getRealPath("/")+savePath,fullFile.getName()); //在项目下新建该文件,
   try {
   item.write(savedFile); //写入文件
   
   } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   }

   
  }
  }
  out.println(" Map"+map.toString());
  out.println(" username="+map.get("username"));
  out.println(map.get("userid")+" "+ map.get("username")+" "+ map.get("userpassword")+" "+map.get("usernickname")+" "+null+" "+map.get("userdescription")+" "+map.get("mabeyuse")+" "+Date.valueOf("".equals(map.get("userdate"))?"2012-1-1":map.get("userdate"))+" "+map.get("usersex")+" "+map.get("useraddr")+" "+map.get("usermail")+" "+map.get("usertel")+" "+ map.get("useralipayid")+" "+ map.get("jurisdiction"));
  FileInputStream str=new FileInputStream(savedFile);//将保存的文件转换为输入流
  int length=str.available();//获取输入流的长度;
        //下面是我将自己的普通表单内容放到User对象中 User user=new User(0, map.get("username"), map.get("userpassword"), map.get("usernickname"), null, map.get("userdescription"), Integer.parseInt(map.get("mabeyuse")==""?"0":map.get("mabeyuse")), Date.valueOf("".equals(map.get("userdate"))?"2012-1-1":map.get("userdate")), map.get("usersex"), map.get("useraddr"), map.get("usermail"), map.get("usertel"), map.get("useralipayid"), Integer.parseInt(map.get("jurisdiction")==""?"0":map.get("jurisdiction"))); UserDao userDao=new UserDaoImpl(); boolean flag=userDao.addUser(user,str,length);//这步是将user对象,输入流,和输入流的长度传到 userdao的addUser方法中 用于添加到数据库; if(flag){ response.sendRedirect("/xxx/UserServlet"); }else{ response.getWriter().print("<script type="text/javascript">alert("添加失败");location.href("/xxx/addUser.jsp");</>"); } } else { out.print("the enctype must be multipart/form-data"); } } }

我的addUser方法如下:


//插如数据库操作,主要是 pst.setBinaryStream(4,file,length);将输入流存入数据库blob类型数据中
public boolean updateUser(User user,FileInputStream file,int length) { boolean flag=true; String sql="update user set username=? ,"+" userpassword=? ," +" usernickname=? ," +" userpicture=? ," +" userdescription=? ," +" mabeyuse=? ," +" userdate=? ," +" usersex=? ," +" useraddr=? ," +" usermail=? ," +" usertel=? ," +" useralipayid=? ," +" jurisdiction=? " +"where userid=? "; try { pst=conn.prepareStatement(sql); pst.setString(1, user.getUsername()); pst.setString(2, user.getUserpassword()); pst.setString(3, user.getUsernickname()); pst.setBinaryStream(4,file,length); pst.setString(5, user.getUserdescription()); pst.setInt(6, user.getMabeyuse()); pst.setDate(7, user.getUserdate()); pst.setString(8, user.getUsersex()); pst.setString(9, user.getUseraddr()); pst.setString(10, user.getUsermail()); pst.setString(11, user.getUsertel()); pst.setString(12, user.getUseralipayid()); pst.setInt(13, user.getJurisdiction()); pst.setInt(14, user.getUserid()); flag=pst.execute(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { DBUtils.closeAll(conn, pst, res); } return !flag; }

将file标签上传内容存入数据库到这就完成了。

下面要做的是从数据库读取blob数据,并显示到jsp界面:

我的jsp显示界面如下:

<table class="tablelist">
 <thead>
 <tr>
 <th><input id="allSelect" type="checkbox" value="" /></th>
 <th>用户编号</th>
 <th>用户名</th>
 <th>密码</th>
 <th>昵称</th>
 <th>头像</th>
 <th>个人描述</th>
 <th>maybe</th>
 <th>用户生日</th>
 <th>用户性别</th>
 <th>收货地址</th>
 <th>邮箱</th>
 <th>手机号</th>
 <th>支付宝账号</th>
 <th>权限</th>
 </tr>
 </thead>
 <tbody> 
 <c:forEach items="${userpage.data }" var="user">
 <tr>
 <td><input name="isSelect" id="${user.userid}" type="checkbox" onchange="selUser(${user.userid})"/></td>
 <td>${user.userid}</td>
 <td>${user.username}</td>
 <td>${user.userpassword}</td>
 <td>${user.usernickname}</td>
 <td><img alt="" width="100px" height="75px" src="/xxx/upload/${user.userdescription}.jpg">
 </td>
 <td>${user.userdescription}</td>
 <td>${user.mabeyuse}</td>
 <td>${user.userdate}</td>
 <td>${user.usersex}</td>
 <td>${user.useraddr}</td>
 <td>${user.usermail}</td>
 <td>${user.usertel}</td>
 <td>${user.useralipayid}</td>
 <td>${user.jurisdiction}</td>
 </tr>
 </c:forEach>
 </tbody>
 </table>

图片用img标签显示 用src读取服务器上图片路径:

我从数据库用getBlob()方法获取blob类型数据,然后新建User对象进行封装这里就不讲了。

后台将blob数据转化为图片的代码如下:

@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 doPost(request, response);
 }

 /**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 response.setContentType("image/*"); 
 request.setCharacterEncoding("utf-8");
 response.setCharacterEncoding("utf-8");
 String scurrentpage=request.getParameter("currentpage");
 if(scurrentpage==null){
  scurrentpage="1";
 }
 UserDao userDao=new UserDaoImpl();
 UserPage uPage= userDao.findUserByPage(Integer.parseInt(scurrentpage), 5);
 List<User> list=uPage.getData(); //这里是获取分页查询到的User对象的List 下面遍历每个User
 for (User us : list) {
  if (us.getUserpicture()==null||us.getUserpicture().equals("")) {
  continue;
  }else{
  try {
  InputStream is=us.getUserpicture().getBinaryStream(); //获取Blob类型变量 并转化为二进制输入流
   if(is!=null){ 
    String uuid=UUID.randomUUID().toString();  //给图片取个独一无二的名字
   is = new BufferedInputStream(is) ; //将输入流读入缓冲区
   BufferedImage bi = ImageIO.read(is) ; //利用ImageIo对象转化为Image对象
   OutputStream oi=new FileOutputStream("D:/tomcat8/webapps/xxx/upload/"+uuid+".jpg");//新建输出流 保存文件到服务器指定路径
   ImageIO.write(bi, "jpeg", oi); //写入文件
   oi.close();
   is.close();
   us.setUserdescription(uuid);//我将图片名字存入User对象中,方便jsp界面读取
   

   }
  } catch (SQLException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  }
 }
 
 request.setAttribute("userpage", uPage);
 request.getRequestDispatcher("/user.jsp").forward(request, response);
 }

}
//在jsp页面读取和读取服务器图片相同
//至此向数据库存入图片,以及从数据库读取图片显示到jsp界面 均已完成。

jsp页面file标签上传图片以及blob类型数据库存取。

标签:

热心网友 时间:2022-04-08 11:35

在JSP页面中用"<input type="file"/> "然后用form提交到后台 得到文件名然后在servlet里面用输入输出流不就可以了。追问大神啊,我是菜鸟,可以说说语句怎么写吗?

追答我的代码你可以看看 前台jsp


投稿

名称:

媒体地址:

-->

图片地址:

-->

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
抖音弹幕怎么关掉?怎么关闭抖音弹幕? 惠普LaserJet P3005D是否支持B5纸的双面打印? word打印出图片总是缺一部分怎么办-word打印图片不完整怎么解决_百度... 理想one哪里产的车辆? 抚州抚州ONE在哪里? one地址在哪里? 如何在图片上写字(如何在图片上添加文字) 网商贷为什么钱没到账 高级经济师职称怎么评 高级经济师需要评审吗 在苏州自考大专! 276分在苏州能上什么好大专 苏州哪里能考大专? 我想考大专 请问要考几门? 请问在苏州哪里可以报名?考多久能考完呢? 在苏州工作,想考个大专文凭,是成人自考好还是函授好? 欧式床什么牌子好 日式沙发的品牌有哪些 中国家用沙发十大品牌有哪些? 衣服怎样防止褪色? 谁知道怎么样做可以防止衣服落色呢? 如何防止衣服脱色? 合肥工业大学翡翠湖校区周围健身房收费怎样 金吉鸟健身价目表是怎么样的? 如何防止衣服脱色 java提取数据库中blob类型的图片,如何全部显示在jsp页面? 请问合肥市卫岗这边有什么健身房?近点的,办月卡一个月多少钱? 合肥工业大学南区附近有健身馆吗,价格怎样 汉堡店退出买十送一,活动,一个汉堡6元,小王买来56个汉堡,要付多少钱? 汉堡店搞活动赠什麼小礼品 汉堡店长期策划方案 优+,怎样把那+号打到优字的右上角? 在EXCEL 中如何输入+ + (+号在上面,+在下面) 在EXCEL 中如何输入+ + (+号在上面,+在下面) 怎么把阿里巴巴互联网加的符号打到右上角 怎么把阿里巴巴互联网加的符号打到右上角 A字右上面有一个+怎么打呀 A字右上面有一个+怎么打呀 收入凭单 开收据,进帐单,收入/支出凭单的区别和格式怎样呢,多谢解答? 收据与收入凭单的区别 收入凭单中的缴款人应该不是收款人吧? pos机刷卡入账写收入凭单,转给银行再写付款凭单可以么 出纳就需要作记帐凭单吗?怎么做?不需要做收.付.转凭证吗?刚接触求救一下,谢谢。。。 工户支票取现,应写收据还是现金收入凭单 收入凭证的兹由添什么 该怎么写呢读后感怎么写呢读后感怎么写呢读后感 吃梨子会胖吗? 每天摇一摇送东西的是什么软件 微信摇一摇每天有次数限制? 老公喜欢在微信上摇一摇添加女人又不聊天什么心理