最近在学习java web,在练习DVD信息管理系统时一直对照片上传问题的处理感到非常棘手,在我的仔细研究和钻研下,终于完美解决了这个难题,下面我讲述一下具体的步骤:

思路阐述:将图片放到项目的/webTest/imgs/文件夹下,为了避免图片名重复,将图片名改为获取当前秒数+ .jpg的格式。然后将图片的项目路径储存到数据库中,以便后面展示图片进行读取图片信息。

java后端怎么获取当前项目的地址 javaweb获取项目路径_html

 

第一步:准备工作

环境要求

1. 开发环境: Eclipse

2.导入两个文件上传的jar包

java后端怎么获取当前项目的地址 javaweb获取项目路径_java_02

 

3 MySQL平台,我用的是dbForge Studio for MySQL。

 

第二步 创建一个PhotoDao类来处理前台file Input上传的图片资源

/**

* @author Mr Tang

* @version Create Time:2018年10月24日 下午8:22:22
* com.tang.dao
*

*/
package com.tang.dao;

import java.io.File;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * @author Mr Tang
 *
 */
public class PhotoDao {
    /**
    *2018年10月24日下午10:41:33
    *这个函数的功能是获取前端的数据集合,将文件打包成File以便后续操作
     */
    public static List<FileItem> getRequsetFileItems(HttpServletRequest request,ServletContext servletContext){
        boolean isMultipart=ServletFileUpload.isMultipartContent(request);
        if(isMultipart) {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            String str="javax.servelet.context.tempdir";
            File repository=(File) servletContext.getAttribute(str);
            factory.setRepository(repository);
            ServletFileUpload upload=new ServletFileUpload(factory);
            try {
                return upload.parseRequest(request);
            }catch (FileUploadException e) {
                // TODO: handle exception
                return null;
            }
        }else {
            return null;
        }
    }
    /**
    *2018年10月24日下午10:37:59
    *这个函数的功能是将文件传到预先设置的绝对路径中,也就是项目里的imgs文件夹
     */
    public static boolean saveFile(FileItem item,String fileName) {        
        File savePath=new File("E:\\Users\\javawebspace\\dvdWeb3.5\\WebContent\\imgs");
        if(!savePath.exists()) {
            savePath.mkdirs();
        }
        File uploadFile=new File(savePath+File.separator+fileName);
        try{
            item.write(uploadFile);
            System.out.println("保存文件成功");
            return true;
        }catch(Exception e){
            System.out.println("保存文件失败");
        }
        return false;
    }
    /**
    *2018年10月24日下午8:02:04
    *这个函数的功能是获取当前时间点与1970年的间隔秒数
     */
    public static int getSecondTimestamp(Date date){
        if (null == date) {
            return 0;
        }
        String timestamp = String.valueOf(date.getTime());
        System.out.println(timestamp);
        int length = timestamp.length();
        if (length > 3) {
            return Integer.valueOf(timestamp.substring(0,length-3));
        } else {
            return 0;
        }
    }
    
    /**
     * 
    *2018年10月24日下午8:42:05
          *这个函数的功能是得到新的照片名称
     */
     public static String getPhotoNewName() {
         Date date=new Date();
         int second=getSecondTimestamp(date);
         String fileName=String.valueOf(second)+".jpg";
         return fileName;
    }
     
     /**
     *2018年10月24日下午8:48:58
              *这个函数的功能是判断文件后缀是否是jpg格式
      */
     public static boolean isGif(FileItem item) {
        String fileFullName=item.getName();
         File fileInfo=new File(fileFullName);
         String suffix = fileInfo.getName().substring(fileInfo.getName().lastIndexOf(".") + 1);
         if(suffix.equals("jpg")) {
             return true;
         }
         return false;        
     }
}

 

第三步 创建一个接收图片的jsp前端页面

 

1 <%@ page language="java" contentType="text/html; charset=UTF-8"
  2     pageEncoding="UTF-8"%>
  3 <%
  4     String path = request.getContextPath();
  5     String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
  6             + path + "/";
  7 %>
  8 <!DOCTYPE html>
  9 <html>
 10 <head>
 11 <meta charset="UTF-8">
 12 <title>添加DVD信息</title>
 13 </head>
 14 <style type="text/css">
 15 table.gridtable {
 16     font-family: verdana, arial, sans-serif;
 17     font-size: 15px;
 18     color: #333333;
 19     border-width: 1px;
 20     border-color: #666666;
 21     border-collapse: collapse;
 22 }
 23 
 24 table.gridtable th {
 25     border-width: 1px;
 26     padding: 8px;
 27     border-style: solid;
 28     border-color: #666666;
 29     background-color: #dedede;
 30 }
 31 
 32 table.gridtable td {
 33     border-width: 1px;
 34     padding: 8px;
 35     border-style: solid;
 36     border-color: #666666;
 37     background-color: #ffffff;
 38 }
 39 </style>
 40 <script type="text/javascript">
 41     //检查登录表单
 42     function checkBox() {
 43 /*         var name = document.getElementById("dvdName").value;
 44         var type = document.getElementById("dvdType").value;
 45 
 46         if (name != ""&&type!="") {
 47             return true;
 48         } else {
 49             document.getElementById("isEmpty").value = "EMPTY";
 50             alert("DVD信息不能为空哦~");
 51             document.getElementById("loginname").focus(); //光标占位
 52             return false;
 53         } */
 54     }
 55 </script>
 56 <body>
 57     <div style="margin-left: 400px">
 58         <h1 style="margin-left: 10px;">添加DVD信息:</h1>
 59         <br>
 60         <form  method="post"
 61             action="${pageContext.request.contextPath}/ProductServlet?method=add"
 62             enctype="multipart/form-data"
 63             >
 64 <!--             onsubmit=" return checkBox()"
 65  -->            <table class="gridtable">
 66                 <tr>
 67                     <td>编号(已自动分配不可修改):
 68                         <div id="myDiv">
 69                         </div>
 70                     </td>
 71                     <td width="300px"><input id="pr_dvdNum" type="text" name="pr_dvdNum"
 72                     value="${nextNum }" disabled="disabled"
 73                      style="border: 0px; font-size: 20px;">
 74                         </td>
 75                 </tr>
 76                 <tr>
 77                     <td>请输入DVD名字:</td>
 78                     <td width="300px"><input id="dvdName" type="text"
 79                         name="dvdName" style="border: 0px; font-size: 20px;"></td>
 80                 </tr>
 81                 <tr>
 82                     <td>请输入DVD状态:</td>
 83                     <td width="300px"><input id="dvdState" type="radio" checked
 84                     value="未借出"    name="dvdState" style="border: 0px; font-size: 20px;">未借出
 85                     <input id="dvdState" type="radio" 
 86                     value="已借出"    name="dvdState" style="border: 0px; font-size: 20px;">已借出
 87                     </td>
 88                 </tr>
 89                 <tr>
 90                 <td>请传入DVD图片<br>必须是gif格式</td>
 91                 <td><input type="file" name="file"
 92                  style="border: 0px; font-size: 20px;"
 93                 /></td>


 94                 </tr>
 95                 <tr>
 96                     <td>请输入DVD类型:</td>
 97                     <td width="300px"><input id="dvdType" type="text"
 98                         name="dvdType" style="border: 0px; font-size: 20px;">
 99                     <input type="hidden" name="currentPage" value="${currentPage}">
100                         
101                         </td>
102                 </tr>
103                 <tr>
104 
105                     <td colspan="2"><input type="submit" value="添加"
106                         style="width: 120px; height: 30px; background-color: blue; border: 0px; color: #fff5ee; font-size: 15px; margin-left: 180px;">
107                         <a href="${pageContext.request.contextPath}/ProductServlet?method=toMainView¤tPage=${currentPage }" style="float: right;">返回主页</a></td>
108                 </tr>
109             </table>
110             <input type="hidden" id="isEmpty" name="isEmpty" value="FULL">
111         </form>
112     </div>
113 </body>
114 </html>

 

说明:由于我是直接把项目中的整个jsp页面展示出来了,所以只需注意红色的部分就可以了。

第四步 创建后台处理Servlet服务端

1 package com.tang.control;
  2 import java.io.IOException;
  3 import java.io.PrintWriter;
  4 import java.sql.SQLException;
  5 import java.util.ArrayList;
  6 import java.util.List;
  7 
  8 import javax.servlet.ServletContext;
  9 import javax.servlet.ServletException;
 10 import javax.servlet.annotation.WebServlet;
 11 import javax.servlet.http.HttpServlet;
 12 import javax.servlet.http.HttpServletRequest;
 13 import javax.servlet.http.HttpServletResponse;
 14 import javax.servlet.http.HttpSession;
 15 
 16 import org.apache.commons.fileupload.FileItem;
 17 
 18 import com.tang.common.Page;
 19 import com.tang.dao.DvdDao;
 20 import com.tang.dao.PhotoDao;
 21 import com.tang.dao.UserDao;
 22 import com.tang.models.DVDInfoData;
 23 
 24 /**
 25  * @author Mr Tang
 26  *
 27  */
 28 @WebServlet("/ProductServlet")
 29 public class ProductServlet extends HttpServlet {
 30     public ProductServlet() {
 31         super();
 32     }
 33     protected void doGet(HttpServletRequest request,
 34             HttpServletResponse response) throws ServletException, IOException {
 35 String method = request.getParameter("method");
 36         try {
 37             switch (method) {
 38                                 case "add":
 39                 //转接给相对应的函数去处理相关数据。
 40                 addDVDinfo(request, response);
 41                 break;
 42                      } catch (SQLException e) {
 43             // TODO Auto-generated catch block
 44             e.printStackTrace();
 45         }
 46     }
 47 /**
 48      * <p>
 49      *  这个函数实现了增加dvd的功能
 50      * <p>
 51      * @throws SQLException 
 52      * @throws ServletException 
 53      */
 54     private static void addDVDinfo(HttpServletRequest request, HttpServletResponse response) throws IOException, SQLException, ServletException {
 55         List<String> list=new ArrayList<String>();
 56         String filename=PhotoDao.getPhotoNewName();
 57         ServletContext servletContext=null;
 58         servletContext=request.getSession().getServletContext();
 59         //数据库中存储格式:/webTest/imgs/***.jpg
 60         //第一步:获取页面上上传的图片资源
 61         List<FileItem> items=PhotoDao.getRequsetFileItems(request,servletContext);
 62         boolean isLoadToSQL=false;
 63         for(FileItem item:items) {
 64             if(!item.isFormField()){
 65                 //判断后缀名是否是jpg
 66                 if(PhotoDao.isGif(item)) {
 67                     isLoadToSQL=PhotoDao.saveFile(item,filename);
 68                 }else {
 69                     System.out.println("后缀格式有误,保存文件失败");
 70                 }
 71             }else { 
 72                 /*获取表单中的非文件值
 73                 表单中的空间name值
 74                 System.out.println("name值:  "+item.getFieldName());
 75                 该name值空间中的value值
 76                 System.out.println(item.getString("UTF-8"));*/
 77                 list.add(item.getString("UTF-8"));
 78             }
 79         }
 80         String dvdNum=DvdDao.returnNextNum();
 81         //存在数据库里面的照片路径是在项目里的相对路径
 82         String finalPhotoName= request.getContextPath()+"/imgs/"+filename;
 83         int bol=DvdDao.addDVD(dvdNum, "《"+list.get(0)+"》",list.get(1),list.get(2),finalPhotoName);
 84         if(list.get(4).equals("FULL")) {
 85             if(bol>0) {
 86                 PrintWriter out=response.getWriter();                                           
 87                 out.flush();                                                                    
 88                 out.print("<script>");                                                          
 89                 out.println("alert('添加DVD信息成功!!!')");                                           
 90                 out.print("window.location.href='ProductServlet?method=toAddView¤tPage=");
 91                 out.print(list.get(3));    /*第四个数下标为3表示主页的页数*/                                                     
 92                 out.print("'</script>\");");                                                    
 93                 out.close();                                                                    
 94             }else {
 95                 PrintWriter out=response.getWriter();
 96                 out.flush();
 97                 out.print("<script>");
 98                 out.println("alert('很抱歉,添加DVD失败,请检查填入信息是否正确!!!')");
 99                 out.println("history.back();");
100                 out.println("</script>");
101                 out.close();
102             }
103         }
104         else if(list.get(4).equals("EMPTY")){
105             PrintWriter out=response.getWriter();
106             out.flush();
107             out.print("<script>");
108             out.print("window.location.href='ProductServlet?method=toAddView';");
109             out.println("</script>");
110             out.close();
111         }
112     }
113 protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
114     doGet(request, response);
115 }
116 }

说明:由于我是直接把项目中的整个ProductServlet页面展示出来了,所以只需注意红色和蓝色的部分就可以了。红色部分的代码实现了文件存储在项目文件里,蓝色部分实现了将dvd实例化的对象存储到数据库中。

第五步:结果展示

java后端怎么获取当前项目的地址 javaweb获取项目路径_apache_03

 

 

 

java后端怎么获取当前项目的地址 javaweb获取项目路径_html_04

 

java后端怎么获取当前项目的地址 javaweb获取项目路径_apache_05

 

java后端怎么获取当前项目的地址 javaweb获取项目路径_html_06

 

 

java后端怎么获取当前项目的地址 javaweb获取项目路径_java后端怎么获取当前项目的地址_07

 

 

 

 

java后端怎么获取当前项目的地址 javaweb获取项目路径_java后端怎么获取当前项目的地址_08

 

 

附加:DVDInfoData.java 文件 和DvdDao.java 文件。(第一个是对DVD信息的封装,第二个是把dvd信息存储到数据库中)

/**

* @author Mr Tang

* @version Create Time:2018年10月2日 下午6:39:04
* com.tang.models
*

*/
package com.tang.models;

/**
 * @author Mr Tang
 *
 */
public class DVDInfoData {
private String dvdnum;
private String dvdname;
private String dvdstate;
private String dvdtype;
private String dvdphoto;
/**
 * 
 */

public DVDInfoData() {
    super();
}
/**
 * @param dvdnum
 * @param dvdname
 * @param dvdstate
 * @param dvdtype
 * @param dvdphoto
 */
public DVDInfoData(String dvdnum, String dvdname, String dvdstate, String dvdtype, String dvdphoto) {
    super();
    this.dvdnum = dvdnum;
    this.dvdname = dvdname;
    this.dvdstate = dvdstate;
    this.dvdtype = dvdtype;
    this.dvdphoto = dvdphoto;
}
}

 

 

package com.tang.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

import com.tang.Util.BeanHandler;
import com.tang.Util.BeanListHandler;
import com.tang.Util.JDBCUtil;
import com.tang.models.DVDInfoData;

/**
 * @author Mr Tang
 * 这个类被用来处理来自数据库的DVD数据,增删改查以及其他功能的实现。
 * 继承自DBUtilsBaseDao,简化数据库操作
 */
public class DvdDao extends DBUtilsBaseDao{
/**
     * @author Mr Tang
     * @throws SQLException 
     * @expression This method is used to show all DVD information to users.
     *It must be do this...
     */
    @SuppressWarnings("unchecked")
    public static  List<DVDInfoData> ShowAllDVD() throws SQLException{
        String sql="SELECT * FROM dvddb order by dvdname desc" ;
        Object[] params= {};
        return (List<DVDInfoData>) JDBCUtil.query(sql, params, new BeanListHandler(DVDInfoData.class));
    }
/**
     * 
     *2018年10月21日下午11:38:46
     *这个函数的功能是添加DVD信息
     */
    public static int addDVD(String dvdNum,String dvdName,String dvdstate,String dvdtype,String dvdphoto) throws SQLException {
        int result=0;
        if(dvdNum!=""&&dvdName!="") {
            Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
            if(pattern.matcher(dvdNum).matches()){
                String sql="INSERT INTO dvddb (dvdnum,dvdname,dvdstate,dvdtype,dvdphoto) VALUES (?,?,?,?,?)" ;
                Object[] params=new Object[]{
                        dvdNum,
                        dvdName,
                        dvdstate,
                        dvdtype,
                        dvdphoto
                };
                result=JDBCUtil.update(sql, params);
            }
        }
        return result;
    }
}