上传下载文件实例(vsftp服务器+nginx) 上传下载文件实例(vsftp服务器+nginx)
页面(上传+下载)
<form action="/pic/upload" enctype="multipart/form-data" method="post">
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="file" name="pic"><br>
<input type="submit" value="提交">
</form>
写实体类(pojo)
public class User {
private Integer uid;
private String username;
private String password;
private String picture;}}
写mapper接口
public interface UserMapper {
int insert(User record);
List<User> select();
}
写mapper.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.example.dao.UserMapper">
<insert id="insert" parameterType="User">
insert into imageupload(username,password,picture) values
(#{username,jdbcType=CHAR},#{password,jdbcType=CHAR},#{picture,jdbcType=CHAR})
</insert>
<select id="select" resultMap="User">
select * from imageupload
</select>
</mapper>
写UserService
public interface UserService {
public void insertUser(User user);
public List<User> selectUser();
}
写UserServiceImpl
@Service
public class UserServiceImpl implements UserService{
@Autowired(required=true)
private UserMapper userMapper;
@Override
public void insertUser(User user) {
userMapper.insert(user);
}
@Override
public List<User> selectUser() {
return userMapper.select();
}
}
写工具类IDUtils(用来生成文件名)
public class IDUtils {
public static String genImageName() {
//取当前时间的长整型值包含毫秒
long millis=System.currentTimeMillis();
//long millis=System.nanoTime();
//加上三位随机数
Random random=new Random();
int end3=random.nextInt(999);//返回从这个随机数生成器的序列中抽取的一个伪随机数,
//如果不足三位前面补0
String str=millis+String.format("%03d", end3);
return str;
}
}
写操作文件上传下载类FtpUtils
public class FtpUtils {
/**
* Description:向FTP服务器上传文件
* @param host FTP服务器ip
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param basePath FTP服务器基础目录,/home/ftpuser/images
* @param filePath FTP服务器文件存放路径。例如分日期存放:、2018/05/28.文件的路径为basePath+filePath
* @param fileName 上传到F服务器上的文件名
* @param input 输入流
* @return 成功返回true。否则返回false
*/
public static boolean uploadFile(String host,int port,String username,String password,String basePath,
String filePath,String fileName,InputStream input) {
boolean result=false;
FTPClient ftp=new FTPClient();//创建客户端
try {
int reply;//响应
ftp.connect(host,port);//链接FTP服务器
//如果采用默认端口,可以使用ftp.connect(host)的方式直接链接ftp服务器
ftp.login(username, password);//登录
reply=ftp.getReplyCode();//返回最后一个FTP应答的应答代码的整数值。
System.out.println("reply="+reply);
if(!FTPReply.isPositiveCompletion(reply)) {//如果应答代码是一个正完成响应(以2开头的230),则为True;如果不是,则为false。
ftp.disconnect();
return result;
}
if(!ftp.changeWorkingDirectory(basePath+fileName)) {//如果目录不存在的话就创建目录
String[] dirs=filePath.split("/");
String tempPath=basePath;///home/ftpuser/images
for(String dir:dirs) {
if(null==dir||"".equals(dir)) {
continue;
}
tempPath+=""+dir;
if(!ftp.changeWorkingDirectory(tempPath)) {//如果更改FTP会话的当前工作目录失败
if(!ftp.makeDirectory(tempPath)) {//如果创建一个新的子目录失败的话。
return result;//返回false
}else {
ftp.changeWorkingDirectory(tempPath);//如果创建成功则更改FTP会话的当前工作目录
}
}
}//整合for循环是为了
}//整个if是为了创建设置的目录
//设置为被动模式
ftp.enterLocalPassiveMode();
//设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//上传文件
if(!ftp.storeFile(fileName, input)) {//读取本地文件失败
return result;
}
input.close();
ftp.logout();//通过发送QUIT命令退出FTP服务器
result=true;
} catch (IOException e) {
e.printStackTrace();
}finally {
if(ftp.isConnected()) {//如果客户机当前连接到服务器
try {
ftp.disconnect();//关闭到FTP服务器的连接,并将连接参数恢复到默认值。
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}
}
些控制台类UserController
@Controller
public class UserController {
@Value("${FTP.PORT}")
private int port;//端口
@Value("${FTP.USERNAME}")
private String userName;//用户名
@Value("${FTP.PASSWORD}")
private String passWord;//密码
@Value("${FTP.BASEPATH}")
private String basePath;//文件在服务器端保存的主目录
@Value("${IMAGE.BASE.URL}")
private String baseUrl;//访问图片时的基础url
@Autowired
private UserService userService;
@RequestMapping("/test")
public String index() {
return "index";
}
@RequestMapping("/pic/upload")
@ResponseBody
public String pictureUpload2(@RequestParam("pic")MultipartFile uploadFile,@RequestParam("username")String username,@RequestParam("password")String password) {
//给上传的图片生成新的文件名
try {
//获取原始文件名
String oldName = uploadFile.getOriginalFilename(); //返回客户机文件系统中的原始文件名。
//使用IDUtils工具类生成新的文件名,新文件名=newName+文件名后缀
String newName=IDUtils.genImageName();
newName=newName+oldName.substring(oldName.lastIndexOf("."));
//生成文件在服务器daunt存储的子目录
String filePath=new Date().toString();
//服务器ip
String host="192.168.172.128";
//把前端输入信息,包括图片的url保存到数据库
User user=new User();
user.setUsername(username);
user.setPassword(password);
user.setPicture(baseUrl+"/"+filePath+"/"+newName);
userService.insertUser(user);
//把图片上传搭配图片服务器
//获取上传的io流
InputStream input=uploadFile.getInputStream();
//调用FtpUtil工具类进行上传
boolean result=FtpUtils.uploadFile(host, port, userName, passWord, basePath, filePath, newName, input);
if(result) {
return "success";
}else {
return "false";
}
} catch (IOException e) {
return "false";
}
}