zoukankan      html  css  js  c++  java
  • 上传下载文件实例(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";

    }

    }

  • 相关阅读:
    【转载】nio介绍+原理+传统IO原理+与传统IO区别+案例
    【Ubuntu】制作执行脚本 | 打包一串命令顺序执行
    Ubuntu 使用教程集锦
    【转载】自定义地图数据瓦片化请求的一种实现方案
    【转载】ROS机器人程序设计 | 期末知识点大总结
    【转载】三维重建(三)相机参数标定与光束平差法(Bundle Adjustment)
    【阅读笔记】《大话数据挖掘》定义和功能
    【转载】C++对象成员与构造函数
    【转载】IP地址和子网划分学习笔记之《子网掩码详解》
    STM32的启动过程一
  • 原文地址:https://www.cnblogs.com/LuoPengSdok/p/11383194.html
Copyright © 2011-2022 走看看