java上传文件(文件,视频,文件夹)到服务器

java使用Sftp上传图片文件到Linux服务器上

需要依赖

  <!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.55</version>
        </dependency>
        <!-- 为了使用@Slf4j注解 -->
         <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

编写工具类,直接上代码,里面有注释直接就可以用;

/**
 * @Description TODO
 * @Version 1.0
 */
@Slf4j
public class uploadUtil {
     
    private static Session session;
    private static ChannelSftp channelSftp;
    /**
     * 获取sftp连接
     * @param ftpaddress
     * @param ftpPassword
     * @param ftpUserName
     */
    public static ChannelSftp getSFTPClient(String ftpaddress, String ftpPassword,
                                            String ftpUserName,int ftpPort) {
     
        //开始时间  用于计时
        long startTime = System.currentTimeMillis();
        JSch jsch = new JSch();// 创建JSch对象
        Channel channel = null;
        try {
     
       		 //根据用户名,主机ip,端口获取一个Session对象
            session = jsch.getSession(ftpUserName, ftpaddress,ftpPort);
            session.setPassword(ftpPassword); // 设置密码
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config); // 为Session对象设置properties
            //session.setTimeout(timeout); // 设置timeout时间
            session.connect(); // 通过Session建立链接
            channel = session.openChannel("sftp"); // 打开SFTP通道
            channel.connect(); // 建立SFTP通道的连接
            long endTime = System.currentTimeMillis();
            log.info("连接sftp成功耗时" + (endTime - startTime) + "毫秒");
            return (ChannelSftp) channel;
        } catch (Exception e) {
     
            e.printStackTrace();
        }
        return null;
    }
    /**
     * @Description //判断目录是否存在
     * @Param [directory, sftp]
     * @return boolean
     **/
    public static boolean isDirExist(String directory, ChannelSftp sftp) {
     
        boolean isDirExistFlag = false;
        try {
     
            SftpATTRS sftpATTRS = sftp.lstat(directory);
            log.info("目录"+directory+"已存在");
            isDirExistFlag = true;
            return sftpATTRS.isDir();
        } catch (Exception e) {
     
            if (e.getMessage().toLowerCase().equals("no such file")) {
     
                log.info("目录"+directory+"不存在");
                isDirExistFlag = false;
            }
        }
        return isDirExistFlag;
    }
    /**
     * @Description //创建目录
     * @Param [createpath, sftp]
     * @return void
     **/
    public static void createDir(String createpath, ChannelSftp sftp) {
     
        try {
     
            String pathArry[] = createpath.split("/");
            StringBuffer filePath = new StringBuffer("/");
            for (String path : pathArry) {
     
                if (path.equals("")) {
     
                    continue;
                }
                filePath.append(path + "/");
                if (isDirExist(filePath.toString(),sftp)) {
     
                    sftp.cd(filePath.toString());
                } else {
     
                    // 建立目录
                    sftp.mkdir(filePath.toString());
                    log.info("创建目录"+filePath.toString()+"成功");
                    // 进入并设置为当前目录
                    sftp.cd(filePath.toString());
                    log.info("进入目录"+filePath.toString());
                }
            }
            sftp.cd(createpath);
        } catch (SftpException e) {
     
//            throw new SystemException("创建路径错误:" + createpath);
        }
    }
    /**
     * @Description //关闭链接资源
     * @Param []
     * @return void
     **/
    public static void close() {
     
        if (channelSftp != null && channelSftp.isConnected()) {
     
            channelSftp.disconnect();
        }
        if (session != null && session.isConnected()) {
     
            session.disconnect();
        }
       log.info("关闭连接资源");
    }
    /**
     * @Description //上传文件
     * @Param [host:上传主机IP, port:端口22, userName:登录名, password:密码
     *   remoteFile:上传路径,in:输入流格式文件, pathName:文件名称]
     * @return boolean
     **/
    public static boolean uploadFile(String host, int port, String userName, String password, String remoteFile, InputStream in, String pathName){
     
        try{
     
            //建立连接
            if (channelSftp == null || !channelSftp.isConnected()) {
     
                channelSftp=getSFTPClient(host,password,userName,port);
            }
            //判断文件夹是否存在,不存在则创建
            if (isDirExist(remoteFile,channelSftp)) {
     
                channelSftp.put(in, remoteFile + "/" +pathName);
                log.info("文件上传成功,文件路径"+remoteFile + "/" +pathName);
                close();
                return true;
            } else {
     
                //创建文件夹在上传文件
                createDir(remoteFile ,channelSftp);
                channelSftp.put(in, remoteFile + "/" +pathName);
                log.info("文件上传成功,文件路径"+remoteFile + "/" +pathName);
                close();
                return true;
            }
        }catch(Exception e){
     
            e.printStackTrace();
            close();
        }
        return false;

    }

/**
     * 文件夹上传
     * @param host sftp地址
     * @param port sftp端口
     * @param userName 登录名
     * @param password 密码
     * @param file 上传的文件夹
     * @param remoteFile sftp服务器文件存放路径
     * @return true 成功,false 失败
     */
    public static boolean uploadDstFile(String host, int port, String userName, String password,
                                        MultipartFile[] file, String remoteFile){
     
        boolean b = false;
        //获取连接
        channelSftp = getConn(userName,password,host,port);
        if (isConnected()) {
     
            b = uploadFiles(file,remoteFile);//循环迭代文件夹
            close();//关闭连接
        }
        return b;
    }

    /**
     * 循环读取文件夹里面的文件上传,不支持文件夹里面嵌套文件夹上传
     * @param file  文件
     * @param remoteFile 服务器路径
     * @return
     */
    private static  boolean uploadFiles(MultipartFile[] file, String remoteFile) {
     
        try {
     
        for (int i = 0; i < file.length; i++) {
     
            InputStream in=null;
                 in = file[i].getInputStream();
               if(i==0){
     //获取设置文件夹名称
 remoteFile=remoteFile+"/"+file[i].getOriginalFilename().substring(0,file[i].getOriginalFilename().lastIndexOf("/"));
               }
               //获取设置文件名称
                String originalFilename = file[i].getOriginalFilename().substring(file[i].getOriginalFilename().lastIndexOf("/"));
                //判断文件夹是否存在,存在则直接上传
                if (isDirExist(remoteFile, channelSftp)) {
     
                    channelSftp.put(in, remoteFile+"/"+originalFilename);
                    log.info("文件上传成功,文件路径" + remoteFile+"/"+originalFilename);
                } else {
     
                    //创建文件夹在上传文件
                    createDir(remoteFile, channelSftp);
                    channelSftp.put(in,  remoteFile+"/"+originalFilename);
                    log.info("文件上传成功,文件路径"+ remoteFile+"/"+originalFilename);
                }
        }
        } catch (IOException e) {
     
            e.printStackTrace();
        } catch (SftpException e) {
     
            e.printStackTrace();
        }
        close();
        return true;
    }
}

下面来测试一下

前端写一个简单的文件和视频上传

//
<form action="/loign1" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit">
</form>
//
var formData = new FormData($("#uploadForm")[0])  //创建一个forData
			formData.append('fileimages', $('#file')[0].files[0])
			$.ajax({
     
				type: "post",
				url: "地址",
				async: false,
				cache: false,
				contentType: false,
				processData: false,
				data: formData,
				dataType: "json",
				success: function(result){
     
				}
			});	

后台测试

@RequestMapping(value = "/loign1",method = RequestMethod.POST)
    public String hellofile(HttpServletRequest request,MultipartFile file) throws IOException {
     
        String fileName = file.getOriginalFilename();// 获取到上传文件的名字
        InputStream inputStream = file.getInputStream();//转换成输入流的方式
        //在这里可以修改的文件名称
       /* String imagesuffix = fileName.substring(fileName.lastIndexOf("."));//获取文件后缀
        String filename="hello"+imagesuffix;//拼接成你想要的名字*/
        //这里调用上面工具类的uploadFile方法里面的参数请参照工具类
        boolean root = uploadUtil.uploadFile();
        return "";
    }
    //如果是视频上传要在"application.yml"或"application.properties"者配置文件
    //中配置文件大小根据需求配置
    spring:
	  servlet:
	    multipart:
	      max-file-size: 9967920994
	      max-request-size: 9967920994

上传文件夹测试

	//文件夹上传要使用 webkitdirectory 关键字
 <form action="/loign3" method="post" enctype="multipart/form-data">
        <input type="file" name="file" webkitdirectory>
        <input type="submit">
    </form>

后台测试

    //上传文件夹到服务器 
    @RequestMapping(value = "/loign3",method = RequestMethod.POST)
    public String hello3(HttpServletRequest request,MultipartFile[] file) throws IOException {
     
            if (file!=null) {
     
            //	uploadDstFile的参数请参照上面的工具类
        	boolean root = uploadUtil.uploadDstFile();
            }
        return "";
    }

你可能感兴趣的:(java,linux,ajax)