All Downloads are FREE. Search and download functionalities are using the official Maven repository.

tech.mhuang.pacebox.oss.ftp.FtpLocalHandler Maven / Gradle / Ivy

package tech.mhuang.pacebox.oss.ftp;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import tech.mhuang.pacebox.core.exception.BusinessException;
import tech.mhuang.pacebox.core.exception.ExceptionUtil;
import tech.mhuang.pacebox.core.file.FileUtil;
import tech.mhuang.pacebox.core.io.IOUtil;
import tech.mhuang.pacebox.oss.BaseOssHandler;
import tech.mhuang.pacebox.oss.OssFieldProperties;
import tech.mhuang.pacebox.oss.domain.OssDeleteRequest;
import tech.mhuang.pacebox.oss.domain.OssDeleteResult;
import tech.mhuang.pacebox.oss.domain.OssDownloadRequest;
import tech.mhuang.pacebox.oss.domain.OssDownloadResult;
import tech.mhuang.pacebox.oss.domain.OssStorageType;
import tech.mhuang.pacebox.oss.domain.OssUploadRequest;
import tech.mhuang.pacebox.oss.domain.OssUploadResult;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;

/**
 * ftp上传文件
 *
 * @author mhuang
 * @since 1.0.0
 */
public class FtpLocalHandler implements BaseOssHandler {
    private OssFieldProperties properties;

    @Override
    public void setProperties(OssFieldProperties properties) {
        this.properties = properties;

    }

    private FTPClient getClient() {
        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient.setControlEncoding(Charset.defaultCharset().name());
            ftpClient.connect(properties.getProxyHost(), properties.getProxyPort());
            ftpClient.login(properties.getProxyUsername(), properties.getProxyPwd());
            int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                throw new BusinessException(500, "无法链接到FTP服务");
            }
        } catch (IOException e) {
            throw new BusinessException(500, "FTP链接异常", e);
        }
        return ftpClient;
    }

    private void resume(FTPClient client) {
        if (client != null && client.isConnected()) {
            try {
                client.logout();
                client.disconnect();
            } catch (IOException ignored) {
            }
        }
    }

    @Override
    public OssUploadResult upload(OssUploadRequest request) {
        OssUploadResult.OssUploadResultBuilder result = OssUploadResult.builder().extendParam(request.getExtendParam());
        FTPClient client = null;
        try {
            client = getClient();
            client.setFileType(FTPClient.BINARY_FILE_TYPE);
            client.makeDirectory(request.getBucketName());
            client.changeWorkingDirectory(request.getBucketName());
            if (request.getStorageType() == OssStorageType.LOCAL) {
                File sourceFile = new File(request.getLocalUrl());
                try (InputStream in = FileUtil.openInputStream(sourceFile)) {
                    client.storeFile(request.getKey(), in);
                }
                if (request.isDelFile()) {
                    sourceFile.delete();
                }
            } else if (request.getStorageType() == OssStorageType.BYTE) {
                try (InputStream in = new ByteArrayInputStream(request.getByteArray())) {
                    client.storeFile(request.getKey(), in);
                }
            } else if (request.getStorageType() == OssStorageType.STREAM) {
                try (InputStream in = request.getInStream()) {
                    client.storeFile(request.getKey(), in);
                }
            } else if (request.getStorageType() == OssStorageType.FILE) {
                try (InputStream in = FileUtil.openInputStream(request.getFile())) {
                    client.storeFile(request.getKey(), in);
                }
                if (request.isDelFile()) {
                    request.getFile().delete();
                }
            }
            result.success(true);
        } catch (Exception e) {
            result.throwable(e).message(ExceptionUtil.getMessage(e));
        } finally {
            resume(client);
        }

        return result.build();
    }

    @Override
    public OssDownloadResult download(OssDownloadRequest request) {
        OssDownloadResult.OssDownloadResultBuilder result = OssDownloadResult.builder().extendParam(request.getExtendParam());
        FTPClient client = null;
        ByteArrayOutputStream out = null;
        try {
            out = new ByteArrayOutputStream();
            client = getClient();
            client.changeWorkingDirectory(request.getBucketName());
            client.setFileType(FTPClient.BINARY_FILE_TYPE);
            client.retrieveFile(request.getKey(), out);
            result.byteArray(out.toByteArray()).success(true);
        } catch (Exception e) {
            result.throwable(e).message(ExceptionUtil.getMessage(e));
        } finally {
            IOUtil.close(out);
            resume(client);
        }
        return result.build();
    }

    @Override
    public OssDeleteResult delete(OssDeleteRequest request) {
        OssDeleteResult.OssDeleteResultBuilder result = OssDeleteResult.builder().extendParam(request.getExtendParam());
        FTPClient client = null;
        try {
            client = getClient();
            client.changeWorkingDirectory(request.getBucketName());
            client.dele(request.getKey());
            result.success(true);
        } catch (Exception e) {
            result.throwable(e).message(ExceptionUtil.getMessage(e));
        } finally {
            resume(client);
        }
        return result.build();
    }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy