文件上传
Controller
@RequestMapping("/upload")
@ResponseBody
public Map<String,String> uploadImg(@RequestParam("file") MultipartFile file, Model model,HttpServletRequest request) throws IOException{
return fileService.upfile(file,request);
}
Service层
public Map<String, String> upfile(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {
Map<String, String> map = new HashMap<>();
map.put("code", "1");
map.put("msg", "上传文件失败");
String fileName = System.currentTimeMillis()+file.getOriginalFilename();//获取文件名
//上传的文件名也需要加上后缀,不然虚拟机不知道文件格式
InputStream inputStream = file.getInputStream();
String filePath = null;
Boolean flag = ftpUtil.uploadFile(fileName, inputStream);//主要就是这里实现了ftp的文件上传
if (flag == true) {
//log.info("上传文件成功!");
filePath = ftpUtil.FTP_BASEPATH + fileName;
map.put("code", "0");
map.put("msg", "上传文件成功");
map.put("fileName",fileName);
}
map.put("path", filePath);
System.out.println(map);
return map;
}
FtpUtil
@Component//这就是我们刚才加入的依赖
public class FtpUtil {
//ftp服务器ip地址
private static final String FTP_ADDRESS = "192.168.111.136";
//端口号
private static final int FTP_PORT = 21;
//用户名
private static final String FTP_USERNAME = "lichenyang";
//密码
private static final String FTP_PASSWORD = "mxy480225354";
//路径都是/home/加上用户名
public final String FTP_BASEPATH = "/home/ftp/data";
//参数传过来了文件和文件的输入流
public boolean uploadFile(String originFileName, InputStream input) {
boolean success = false;
FTPClient ftp = new FTPClient();//这是最开始引入的依赖里的方法
ftp.setControlEncoding("utf-8"); //设置编码
ftp.enterLocalPassiveMode(); //设置被动连接
try {
int reply;
ftp.connect(FTP_ADDRESS, FTP_PORT);// 连接FTP服务器
ftp.login(FTP_USERNAME, FTP_PASSWORD);// 登录
reply = ftp.getReplyCode();//连接成功会的到一个返回状态码
System.out.println(reply);//可以输出看一下是否连接成功
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);//设置文件类型
ftp.setFileTransferMode(FTP.STREAM_TRANSFER_MODE); //设置流方式
ftp.changeWorkingDirectory(FTP_BASEPATH);//修改操作空间
//对了这里说明一下你所操作的文件夹必须要有可读权限,chomd 777 文件夹名//这里我就是用的我的home文件夹
System.out.println(originFileName);
boolean state = ftp.storeFile(originFileName, input);//这里开始上传文件
System.out.println(ftp.getReplyString()); //如果错误,打印错误信息
System.out.println(state);
if (!FTPReply.isPositiveCompletion(reply)) { //检查连接返回的状态码c
ftp.disconnect();
System.out.println("连接失败");
return success;
}
System.out.println("连接成功!");
input.close();
ftp.logout();
success = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
public boolean downloadFile(String filename, HttpServletResponse response) {
boolean flag = false;
FTPClient ftp = new FTPClient();
OutputStream os = null;
InputStream inputStream = null;
String re=null;
try {
ftp.connect(FTP_ADDRESS, FTP_PORT);// 连接FTP服务器
ftp.login(FTP_USERNAME, FTP_PASSWORD);// 登录
ftp.enterLocalPassiveMode();
ftp.changeWorkingDirectory(FTP_BASEPATH);//跳转到指定目录
FTPFile[] ftpFiles = ftp.listFiles();
String picType;
//然后便利这个数组找出和我们要下载的文件的文件名一样的文件
for (FTPFile file : ftpFiles) {
//解决中文乱码,两次解码
byte[] bytes = file.getName().getBytes("ISO-8859-1");
file.setName(new String(bytes, "utf-8"));
System.out.println("name: " + file.getName());//
if (filename.equalsIgnoreCase(file.getName())) {//判断找到所下载的文件,file.getName就是服务器上对应的文件
//下面就是通过文件id再去数据库查找文件的中文名,将这个作为文件名下载到本地目录
System.out.println(true);
String fileName = file.getName();
inputStream = ftp.retrieveFileStream(fileName);
System.out.println("该文件的文件名:"+fileName);
picType = fileName.split("\\.")[1];
BufferedImage bufferedImage = null;
bufferedImage = ImageIO.read(inputStream);
os = response.getOutputStream();
ImageIO.write(bufferedImage,picType,os);
break;
}
}
ftp.logout();
flag = true;
System.out.println("下载文件成功");
} catch (Exception e) {
System.out.println("下载文件失败");
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != os) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
}
图片回显到前端页面
Controller
@RequestMapping("/loadImg")
@ResponseBody
public void loadImg(HttpServletResponse response,String fileName){
boolean flag = false;
//这里我要得到文件的id和type作为filename去下载,下载是通过filename去对应的目录查找文件名相同的文件下载下来,后台将文件名转换中文文件名。
try {
flag = fileService.downfile(fileName,response);//下载调用service层的方法
System.out.println(flag);
} catch (IOException e) {
e.printStackTrace();
}
}
Service层
public boolean downfile(String filename, HttpServletResponse response) throws IOException {
boolean flag ;//同样这里也是用ftpUtil这个工具类去下载,传入文件的存放地址和文件名,和文件在服务器上的地址
flag = ftpUtil.downloadFile(filename,response);
return flag;
}
Layui前端页面
<div class="layui-upload">
<button type="button" class="layui-btn" id="fileImage">上传图片</button>
<div class="layui-upload-list">
<img class="layui-upload-img" id="demo1" width="100px" height="100px">
<p id="demoText"></p>
</div>
<input type="hidden" id="imageId">
</div>
<script type="text/html" id="photo">
<div>
<img src="/loadImg?fileName={{d.imageId}}" width="50px" height="50px"/>
</div>
</script>
layui.use(['table','layer'], function(){
$ = layui.jquery;
table = layui.table;
layer = layui.layer
table.render({
elem: '#test'
,url:'/member/listJson'
,toolbar: '#toolbarDemo'
,title: '用户数据表'
,height:500
,defaultToolbar: []
,cols: [
[
{type: 'checkbox', fixed: 'left'}
,{field:'dyId', title:'党员ID',sort: true,align:'center',hide:true}
,{field:'imageId', title:'头像',width:100,align:'center',templet:'#photo'}
,{field:'dyName', title:'党员姓名', width:150,align:'center'}
,{field:'dySex', title:'性别', width:150,align:'center'}
,{field:'dyRdtime', title:'入党日期', width:150,align:'center'}
,{field:'dyPosition', title:'党内职务',width:150,align:'center'}
,{fixed: 'right', title:'操作', toolbar: '#barDemo', width:150,align:'center'}
]
]
,page: true
,id:'MTable'
});
//图片上传
layui.use('upload', function(){
var $ = layui.jquery
,upload = layui.upload;
var dyPhone = $("#dyPhone").val();
//普通图片上传
var uploadInst = upload.render({
elem: '#fileImage'
,url: '/upload?dyPhone='+dyPhone
,accept:'file'
,size:50000
,multiple:true
,before: function(obj){
obj.preview(function(index, file, result){
$('#demo1').attr('src', result);
});
}
,done: function(res){
//如果上传失败
if(res.code > 0){
return layer.msg('上传失败');
}
//上传成功
var demoText = $('#demoText');
demoText.html('<span style="color: #4cae4c;">上传成功</span>');
var imageId = $("#imageId");
imageId.attr('value',res.fileName);
}
,error: function(){
//演示失败状态,并实现重传
var demoText = $('#demoText');
demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
demoText.find('.demo-reload').on('click', function(){
uploadInst.upload();
});
}
});
});