IDEA上传图片到tomcat服务器上
前端页面:
JS代码:
//选中图片
var form = document.getElementById("danxuan");
// 用表单来初始化
var formData = new FormData(form);
formData.append("multipartFile",formData.get("tplj"));
$.ajax({
url:"/testList/insertAndPicture" ,
type:"post",
data:formData,
cache: false,
processData : false, // 不处理发送的数据,因为data值是Formdata对象,不需要对数据做处理 必需写
contentType : false, // 不设置Content-type请求头 必需写
async:false,
success:function (obj){
$("#tplj").val(""); //将输入框的值置为空字符串
if(obj.map.statusCode==){
alert("添加失败");
window.location.href="./hsz_questionbase.html";
}
if(obj.map.statusCode === ){
alert("添加成功");
window.location.href="./hsz_questionbase.html";
}
},
})
form表单:
<form id="danxuan" action="#" method="post" enctype="multipart/form-data">
<span>请添加单选题:</span>
<br />
<input type="hidden" name="stlx" value="">
试题科目:<select id="danxuanstkm" name="stkm">
<!--后台查询出来填入-->
</select><br>
试题名称:<br /><input type="text" name="stmc" required="required" class="form-control " style="width: 300px;"/>
题干(上传图片或手动输入):
<input type="file" id="tpljdanxuan" name="tplj" multiple="multiple" >
<br />
<!--<textarea name="sttg" class="form-control" cols="" rows="" style="resize: none;width: 600px;"></textarea>-->
A选项:<input type="text" name="sttg" required="required" class="form-control" style="width: 300px;"/>
B选项:<input type="text" name="sttg" required="required" class="form-control" style="width: 300px;"/>
C选项:<input type="text" name="sttg" required="required" class="form-control" style="width: 300px;"/>
D选项:<input type="text" name="sttg" required="required" class="form-control" style="width: 300px;"/>
<br />
答案:
<input type="radio" value="A" name="stda"/>A
<input type="radio" value="B" name="stda"/>B
<input type="radio" value="C" name="stda"/>C
<input type="radio" value="D" name="stda"/>D
<br /><br />
是否显示本题:
<input type="radio" value="" name="xsbz" checked="checked"/>显示
<input type="radio" value="" name="xsbz"/>不显示 <br>
<input class="btn btn-primary" type="submit" onclick="addDX()" value="确认出题"/>
</form>
Controller层:
本来这个方法的参数写的是public ResultEntity insert(MultipartFile multipartFile,TestList testList),但是运行的时候一直报参数不匹配,所以就将前台传过来的参数全部列出来,
并在方法中添加到list集合里
//添加试题(包含图片)
@RequestMapping("/insertAndPicture")
public ResultEntity insert(MultipartFile multipartFile, String stkm, String stmc, String sttg, String stda, String xsbz, String stlx, HttpServletRequest request){
TestList testList = new TestList();
testList.setStkm(stkm);
testList.setStmc(stmc);
testList.setSttg(sttg);
testList.setStda(stda);
testList.setXsbz(xsbz);
testList.setStlx(stlx);
try{
if (multipartFile.isEmpty()){
return ResultEntity.error();
}
String stdm = getProcedure.getEightCode("nms_code_stdm_id"); //生成8位试题代码流水号//设置存到数据库的试题代码
testList.setStdm(stdm);
String sxh = getProcedure.getEightCode("nms_code_stdm_sxh"); //生成8位顺序号流水号
//设置存到数据库的顺序号
testList.setSxh(Integer.valueOf(sxh));
//设置存到数据库的出题人(获取登录用户)
HttpSession session = request.getSession();
Login info = (Login) session.getAttribute("info");
testList.setCtr(info.getUsername());
testListService.add(multipartFile,testList);
return ResultEntity.success();
}catch (Exception e){
e.printStackTrace();
return ResultEntity.error();
}
}
Service方法:
本来项目没有挂载到tomcat服务器中,所以将图片的位置存到了项目中
后来项目要发布到tomcat中,所以重新写了一个方法,将图片存到tomcat下的webapps中
package com.tphy.nursing.exam.service; import com.tphy.nursing.exam.bean.SJXXNEXTGroup;
import com.tphy.nursing.exam.bean.TestList; import com.tphy.nursing.exam.mapper.TestListMapper;
import com.tphy.nursing.util.UploadUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; @Service
public class TestListServiceImpl implements TestListService{
//图片上传路径
private static final String UPLOAD_DIR = url();
/*使用IDEA内置tomcat使用本方法*/
// public static String url(){
// File file = new File("src/main/webapp/upload");
// String url = file.getAbsoluteFile().toString();
// System.out.println("########图片路径########"+url);
// return url;
// }
/*挂到tomcat服务器上使用本方法*/
public static String url(){
//测试获取tomcat下的webapps路径
String upload; //存到webapps下文件的名称
String tomcat_path = System.getProperty("user.dir");
System.out.println("tomcatPath:" + tomcat_path);
//获取Tomcat服务器所在路径的最后一个文件目录
String bin_path = tomcat_path.substring(tomcat_path.lastIndexOf("\\")+,tomcat_path.length());
System.out.println(bin_path);
//若最后一个文件目录为bin目录,则服务器为手动启动
if(("bin").equals(bin_path)){//手动启动Tomcat时获取路径为:D:\Software\Tomcat-8.5\bin
//获取保存上传图片的文件路径
upload = tomcat_path.substring(,System.getProperty( "user.dir" ).lastIndexOf("\\")) +"\\webapps"+"\\upload\\";
}else{//服务中自启动Tomcat时获取路径为:D:\Software\Tomcat-8.5
upload = tomcat_path+"\\webapps"+"\\upload\\";
}
return upload;
} //不建议用new UploadUtils,因为要低耦合,建议把UploadUtils类的upload方法换成静态的方法
private UploadUtils uploadUtils = new UploadUtils();
@Autowired
private TestListMapper testListMapper; @Override
@Transactional
public void add(MultipartFile multipartFile, TestList testList) {
String newPath = uploadUtils.upload(UPLOAD_DIR, multipartFile);
System.out.println("更新后图片路径:" + newPath);
//设置存到数据库的图片路径
testList.setTplj(newPath);
//设置存到数据库的创建时间
testList.setCjsj(new Date());
//设置存到数据库的修改时间
testList.setXgsj(new Date());
testListMapper.insert(testList);
} }
工具类:
图片:
package com.tphy.nursing.util;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.multipart.MultipartFile; import java.io.*;
import java.util.UUID; public class UploadUtils {
public String upload(String path,MultipartFile multipartFile){
//拿到文件的原始名称,即例如a.jpg
String originalFilename = multipartFile.getOriginalFilename(); //判断是否为空
if (originalFilename==null){
return null;
}
//因为上传文件只有一个upload目录,所有的文件都会放在这个文件下,会堆积大量的文件,所以把文件进行分开在upload不同的目录中,利用hash算法就行计算分配目录。例如upload/4/5;或者upload/5/5;这种
//拿到文件原名称的hashcode
int hashCode = originalFilename.hashCode();
//拿到upload下第一个目录的名称upload/n
int dir1 = hashCode & 0xf;
//拿到upload下的n目录下的目录名称upload/n/n
int dir2 = (hashCode & 0xf0) >> ;
//拼接路径,path是传过来的文件保存路径,即upload的真实路径,
String dir = path + File.separator+dir1 + File.separator + dir2;
//把路径丢到File文件中
File file = new File(dir);
//如果d:\1\2这个文件夹不存在,才创建
if (!file.exists()){
file.mkdirs();
}
//生成新的UUID.randomUUID().toString():为了防止文件名重复
String newFileName = UUID.randomUUID().toString().replace("-","")+"."+originalFilename.substring(originalFilename.lastIndexOf(".")+);
InputStream is = null;
OutputStream os = null;
try {
is = multipartFile.getInputStream();
os = new FileOutputStream(dir+File.separator+newFileName);
//对文件进行复制
FileCopyUtils.copy(is,os);
} catch (IOException e) {
e.printStackTrace();
}finally {
if (is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os!=null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//返回文件的路径,以便保存到数据库中
return dir1+File.separator+dir2+File.separator+newFileName;
}
}
生成不同位数的流水号:
package com.tphy.nursing.util; import com.tphy.nursing.system.bean.Resources;
import com.tphy.nursing.system.mapper.ResourcesMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service; import java.util.HashMap;
import java.util.Map; /**
* @author :lqw
* @date :Created in 2020/2/28 10:35
* @description:调用存储过程
* @modified By:
* @version: 1
*/
@Component
public class GetProcedure { @Autowired
ResourcesMapper resourcesMapper ; /**
* create by: lqw
* description: 获取10位自增id
* create time: 2020/3/4 17:50
*
* @param :
* @return * @return : null
*/
public String getCode(String type){ Map<String,String> params = new HashMap<>();
params.put("prm_lx",type);
resourcesMapper.GetProcedure(params);
return params.get("prm_bh");
} /**
* create by: lqw
* description: 获取两位自增id
* create time: 2020/3/4 17:51
*
* @param :
* @return * @return : null
*/
public String getTwoCode(String type){
Map<String,String> params = new HashMap<>();
params.put("prm_lx",type);
resourcesMapper.GetProcedure(params);
return params.get("prm_bh").substring(); }
/**
* create by: lqw
* description: 获取三位自增id
* create time: 2020/3/4 17:51
*
* @param :
* @return * @return : null
*/
public String getThreeCode(String type){
Map<String,String> params = new HashMap<>();
params.put("prm_lx",type);
resourcesMapper.GetProcedure(params);
return params.get("prm_bh").substring(); }
/**
* create by: lqw
* description: 获取4位自增id
* create time: 2020/3/4 17:51
*
* @param :
* @return * @return : null
*/
public String getFourCode(String type){
Map<String,String> params = new HashMap<>();
params.put("prm_lx",type);
resourcesMapper.GetProcedure(params);
return params.get("prm_bh").substring(); }
/**
* create by: lqw
* description: 获取6位自增id
* create time: 2020/3/4 17:51
*
* @param :
* @return * @return : null
*/
public String getSixCode(String type){
Map<String,String> params = new HashMap<>();
params.put("prm_lx",type);
resourcesMapper.GetProcedure(params);
return params.get("prm_bh").substring(); }
/**
* create by: lqw
* description: 获取8位自增id
* create time: 2020/3/4 17:51
*
* @param :
* @return * @return : null
*/
public String getEightCode(String type){
Map<String,String> params = new HashMap<>();
params.put("prm_lx",type);
resourcesMapper.GetProcedure(params);
return params.get("prm_bh").substring(); } }
返回结果集:
package com.tphy.nursing.util; import java.util.HashMap;
import java.util.Map; public class ResultEntity {
public Map<String,Object> map=new HashMap<String, Object>();
public ResultEntity put(String str, Object obj){
this.map.put(str,obj);
return this;
}
public static ResultEntity success(){
ResultEntity entity=new ResultEntity();
entity.map.put("statusCode",);
entity.map.put("message","响应成功");
return entity;
}
public static ResultEntity error(){
ResultEntity entity=new ResultEntity();
entity.map.put("statusCode",);
entity.map.put("message","响应失败");
return entity;
}
}
IDEA上传图片到tomcat服务器上的更多相关文章
- 详细的图文教程来实现 eclipse环境下如何配置tomcat,并且把项目部署到Tomcat服务器上
很多初学,尤其自学JavaWeb的朋友首次在eclipse下配置tomcat时,总会有种难下手的感觉,在此,通过图文解说的方法,最直观的向大家演示一遍该配置过程. 第一部分:eclipse环境下如何配 ...
- Java Project部署到Tomcat服务器上
所有的JAVA程序员,在编写WEB程序时,一般都通过工具如 MyEclipse,编写一个WEB Project,通过工具让这个WEB程序和Tomcat关联.其实在我们可以通过JAVA程序部署到Tomc ...
- linux的tomcat服务器上部署项目的方法
在tomcat服务器上部署项目的前提,是我们已经准备好了tomcat服务器.在CentOs环境下部署JavaWeb环境,部署tomcat服务器在前面的文章中已经总结过了,可以参考以前文章. 一 to ...
- 一个tomcat服务器上部署多个Web项目,不同域名访问
[参考]一个tomcat服务器上部署多个项目,不同域名访问 我们一个服务器只按装了一个tomcat服务器,现在有多个项目或者多个域名访问,下面来进行配置 在这里我们只需要修改conf下的server. ...
- JaCoCo在Tomcat服务器上监控代码覆盖率的使用方法
简介 Jacoco是一个开源的覆盖率工具.Jacoco可以嵌入到Ant .Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序.很多第三方的工具提 ...
- Springboot解决war包放到Tomcat服务器上404的特殊情况
Springboot解决war包放到Tomcat服务器上404的特殊情况 原文链接:https://www.cnblogs.com/blog5277/p/9330577.html 原文作者:博客园-- ...
- 将WeX5部署到自己的Tomcat服务器上
页面服务UIServer布署 WeX5自带页面服务UIServer的是标准Web应用,可以部署在Java Web应用服务器上.下面介绍如何在Tomcat和WebLogic中部署WeX5的UIServe ...
- 在 eclipse 中将 web 项目部署到 tomcat 服务器上
1.在 eclipse 中,选择 Window--->Preferences--->Server--->Runtime Environments,选择 Add 按钮 2.在弹出的对话 ...
- 将eclipse上的web项目部署到Tomcat服务器上经验总结
1. 将Tomcat插件添加到eclipse上 Window --> Preferences --> Server --> Runtime Environment --> A ...
随机推荐
- Linux内核初探 之 进程(三) —— 进程调度算法
一.基本概念 抢占 Linux提供抢占式多任务,基于时间片和优先级对进程进行强制挂起 非抢占的系统需要进程自己让步(yielding) 进程类型 IO消耗型 经常处于可运行态,等待IO操作过程会阻塞 ...
- 为什么 generator 忽略第一次 next 调用的参数值呢?
首先要理解几个基本概念. 执行生成器不会执行生成器函数体的代码,只是获得一个遍历器 一旦调用 next,函数体就开始执行,一旦遇到 yield 就返回执行结果,暂停执行 第二次 next 的参数会作为 ...
- Hexo搭建个人博客(一)— 前期准备
最近几个月自学python的过程中,搜索爬虫资料的时候关注了xlzd的博客,为我开启了一片新世界,之后慢慢收藏了各方高人的博客.搭建一个自己博客的萌芽也悄然种下,也许是命运使然,在逛知乎的时候偶然间看 ...
- Spring Boot从入门到精通(六)集成Redis实现缓存机制
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...
- 前阿里数据库专家总结的MySQL里的各种锁(下篇)
在上篇中,我们介绍了MySQL中的全局锁和表锁. 今天,我们专注于介绍一下行锁,这个在日常开发和面试中常常困扰我们的问题. 1.行锁基础 由于全局锁和表锁对增删改查的性能都会有较大影响,所以,我们自然 ...
- 前端面试题(HTML、CSS部分)
HTML.CSS部分: 一.html5有哪些新特性.移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5? 新特性: HTML5 现在已经不是 SGML 的 ...
- Keras在MNIST实现LeNet-5模型训练时的错误?
当使用Keras API 训练模型时,训练时报错? UnknownError (see above for traceback): Failed to get convolution algorith ...
- disruptor 链路实战 三
一.创建Event类 Trade import java.util.concurrent.atomic.AtomicInteger; public class Trade { private Stri ...
- React的组件
React的组件化思想尤为明显,一切皆组件,觉着比Vue的组件化思想更加凸显. const PacketBG = (props) =>( <div className="pack ...
- EF多租户实例:如何快速实现和同时支持多个DbContext
前言 上一篇随笔我们谈到了多租户模式,通过多租户模式的演化的例子.大致归纳和总结了几种模式的表现形式. 并且顺带提到了读写分离. 通过好几次的代码调整,使得这个库更加通用.今天我们聊聊怎么通过该类库快 ...