精华内容
下载资源
问答
  • Apache FTPServer Java代码搭建FTP服务器

    万次阅读 2017-09-30 11:09:19
    官网地址:http://mina.apache.org/ftpserver-project/使用Java代码搭建FTP服务器,步骤如下:第一步:导入maven依赖<dependencies> <dependency> <groupId>org.apache.ftpser

    The Apache FtpServer is a 100% pure Java FTP server.
    官网地址:http://mina.apache.org/ftpserver-project/

    使用Java代码搭建FTP服务器,步骤如下:

    第一步:导入maven依赖

    <dependencies>
      	<dependency>
    	    <groupId>org.apache.ftpserver</groupId>
    	    <artifactId>ftpserver-core</artifactId>
    	    <version>1.1.1</version>
    	    <scope>compile</scope>
    	</dependency>
    	<dependency>  
    	    <groupId>org.slf4j</groupId>  
    	    <artifactId>slf4j-log4j12</artifactId>  
    	    <version>1.7.2</version>  
    	</dependency>
      </dependencies>
    

    上面导入了Ftp Server的核心包和日志包

    第二步:代码实现

    public static void main(String[] args) throws FtpException {
    		FtpServerFactory serverFactory = new FtpServerFactory();
    		
    		ListenerFactory factory = new ListenerFactory();
    		//设置监听端口
    		factory.setPort(2121);
    		
    		//替换默认监听
    		serverFactory.addListener("default", factory.createListener());
    		
    		//用户名
    		BaseUser user = new BaseUser(); 
    	    user.setName("admin");
    		//密码 如果不设置密码就是匿名用户
    	    user.setPassword("123456");
    	    //用户主目录
    	    user.setHomeDirectory("E:\\FTPServerPath");
    	      
    	    List<Authority> authorities = new ArrayList<Authority>();  
    	    //增加写权限
    	    authorities.add(new WritePermission());
    	    user.setAuthorities(authorities);  
    	    
    	    //增加该用户
    	    serverFactory.getUserManager().save(user);  
    		
    	    /**
    	     * 也可以使用配置文件来管理用户
    	     */
    //	    PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory();  
    //	    userManagerFactory.setFile(new File("users.properties"));
    //	    serverFactory.setUserManager(userManagerFactory.createUserManager()); 
    		
    	    FtpServer server = serverFactory.createServer();  
    	    server.start();
    	}
    

    这里写图片描述

    第三步:访问效果

    这里写图片描述

    展开全文
  • 基于Linux服务器JAVA开发环境搭建

    千次阅读 2021-07-21 10:03:50
    Linux服务器开发换件搭建Java)linux系统上安装Mysql获取Mysql YUM源安装mysql源在线安装MySQL启动mysql设置开机自启动通过 cat /var/log/mysqld.log | grep password 命令查看数据库的密码输入exit退出,打开...

    Linux安装Java

    在Linux系统中安装java环境,以openjdk1.8为准。

    一、使用yum查询JDK

    yum search java|grep jdk
    

    在这里插入图片描述

    二、执行安装命令

    yum install java-1.8.0-openjdk
    

    在这里插入图片描述
    安装成功后,默认安装路径在/usr/lib/jvm/下边,
    如/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.144-0.b01.el6_9.x86_64

    查看安装路径(如下所示):

    which java
    ls -lrt /usr/bin/java
    

    三、验证java是否安装成功

    • 查看java版本:java -version
      在这里插入图片描述

    • 查看java是否可用:javac
      在这里插入图片描述
      错误原因:默认安装完只有运行环境,java安装目录下只有jre文件夹

    四、安装开发环境

    yum install java-1.8.0-openjdk-devel.x86_64
    

    再次输入javac说明安装成功
    在这里插入图片描述

    Linux安装Nginx

    一、安装前环境检查

    在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel
    eg:是否安装了gcc

    yum list installed | grep "gcc"
    

    如果没有安装,就是使用下列命令安装。

    yum -y install gcc
    

    二、下载Nginx压缩包

    ## 解压
    tar -zxvf nginx-1.9.9.tar.gz
    
    ##进入nginx目录
    cd nginx-1.9.9
    ## 配置
    ./configure --prefix=/usr/local/nginx
    # make
    make
    make install
    

    测试是否安装成功

    # cd到刚才配置的安装目录
    cd /usr/loca/nginx/
    ./sbin/nginx -t
    

    linux系统上安装Mysql

    一、获取Mysql YUM源

    打开网址:https://dev.mysql.com/downloads/repo/yum/ 根据自己的操作系统选择人对应的版本。
    在这里插入图片描述
    点击“No thanks, just start my download.”,进行下载。
    在这里插入图片描述
    将下载好的YUM源通过ftp工具(XFTP等)上传到指定的Linux服务器中。
    在这里插入图片描述

    二、安装mysql源

    yum -y localinstall mysql80-community-release-el7-1.noarch.rpm
    

    在这里插入图片描述

    三、在线安装MySQL

    yum -y install mysql-community-server,下载的东西比较多要稍微等会;
    在这里插入图片描述

    四、启动mysql

    systemctl start mysqld
    

    设置开机自启动

    systemctl enable mysqld
    
    systemctl daemon-reload
    

    在这里插入图片描述
    通过 cat /var/log/mysqld.log | grep password 命令查看数据库的密码
    在这里插入图片描述
    通过 mysql -uroot -p 进入数据库登陆界面,输入刚刚查到的密码,进行数据库的登陆,复制粘贴就行,MySQL 的登陆密码也是不显示的
    在这里插入图片描述
    通过 ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘你的密码’; 命令来修改密码
    通过 exit; 命令退出 MySQL,然后通过新密码(root)再次登陆。

    注意根据mysql密码策略,如果设置的密码过于简单则不会通过,你的 密码应该包含大小写字母、数字和特殊字符。当然也可以通过修改密码安全强度来降低密码复杂度的要求,但是通常不建议这么做。

    通过以下命令,进行远程访问的授权

    create user 'root'@'%' identified with mysql_native_password by '你的密码';
    grant all privileges on *.* to 'root'@'%' with grant option;
    flush privileges;
    

    在这里插入图片描述

    #输入exit退出,打开防火墙开放3306端口
    输入下面命令,开放3306端口

    firewall-cmd --zone=public --add-port=3306/tcp --permanent
    firewall-cmd --reload
    

    如果是使用云服务,需要在安全规则组打开3306端口,阿里云为例:
    在这里插入图片描述

    Linux安装Redis

    下载Redis
    进入官网找到下载地址 https://redis.io/download
    在这里插入图片描述
    使用ftp工具将下载下来的redis压缩包,使用解压命令解压文件。

    tar -zvxf redis-5.0.7.tar.gz
    

    移动redis目录

    一般都会将redis目录放置到 /usr/local/redis目录,所以这里输入下面命令将目前在/root目录下的redis-5.0.7文件夹更改目录,同时更改文件夹名称为redis。

    mv /root/redis-5.0.7 /usr/local/redis
    

    cd 到/usr/local目录下输入ls命令可以查询到当前目录已经多了一个redis子目录,同时/root目录下已经没有redis-5.0.7文件夹.

    编译

    cd到/usr/local/redis目录,输入命令make执行编译命令,接下来控制台会输出各种编译过程中输出的内容。
    在这里插入图片描述
    启动redis
    根据上面的操作已经将redis安装完成了。在目录/usr/local/redis 输入下面命令启动redis

    ./bin/redis-server& ./redis.conf
    

    上面的启动方式是采取后台进程方式,下面是采取显示启动方式(如在配置文件设置了daemonize属性为yes则跟后台进程方式启动其实一样)。

    ./bin/redis-server ./redis.conf
    

    两种方式区别无非是有无带符号&的区别。 redis-server 后面是配置文件,目的是根据该配置文件的配置启动redis服务。redis.conf配置文件允许自定义多个配置文件,通过启动时指定读取哪个即可。

    redis.conf配置文件

    在目录/usr/local/redis下有一个redis.conf的配置文件。我们上面启动方式就是执行了该配置文件的配置运行的。我么可以通过cat、vim、less等Linux内置的读取命令读取该文件。

    也可以通过redis-cli命令进入redis控制台后通过CONFIG GET * 的方式读取所有配置项。 如下:

    redis-cli
    CONFIG GET *
    

    回车确认后会将所有配置项读取出来,如下图
    在这里插入图片描述
    这里列举下比较重要的配置项

    配置项名称配置项值范围说明
    daemonizeyes、noyes表示启用守护进程,默认是no即不以守护进程方式运行。其中Windows系统下不支持启用守护进程方式运行
    port 指定 Redis 监听端口,默认端口为 6379
    bind 绑定的主机地址,如果需要设置远程访问则直接将这个属性备注下或者改为bind * 即可,这个属性和下面的protected-mode控制了是否可以远程访问 。
    protected-modeyes 、no保护模式,该模式控制外部网是否可以连接redis服务,默认是yes,所以默认我们外网是无法访问的,如需外网连接rendis服务则需要将此属性改为no。
    timeout300当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能
    logleveldebug、verbose、notice、warning日志级别,默认为 notice
    databases16设置数据库的数量,默认的数据库是0。整个通过客户端工具可以看得到
    rdbcompressionyes、no指定存储至本地数据库时是否压缩数据,默认为 yes,Redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大。
    dbfilenamedump.rdb指定本地数据库文件名,默认值为 dump.rdb
    dir 指定本地数据库存放目录
    requirepass 设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH <password> 命令提供密码,默认关闭
    maxclients0设置同一时间最大客户端连接数,默认无限制,Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息。
    maxmemoryXXX <bytes>指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis 新的 vm 机制,会把 Key 存放内存,Value 会存放在 swap 区。配置项值范围列里XXX为数值。

    这里我要将daemonize改为yes,不然我每次启动都得在redis-server命令后面加符号&,不这样操作则只要回到Linux控制台则redis服务会自动关闭,同时也将bind注释,将protected-mode设置为no。
    这样启动后我就可以在外网访问了。

    更改方式:

    vim /usr/local/redis/redis.conf
    

    通过 /daemonize 查找到属性,默认是no,更改为yes即可。 (通过/关键字查找出现多个结果则使用 n字符切换到下一个即可,查找到结果后输入:noh退回到正常模式)

    如下图:
    在这里插入图片描述
    其他两个属性也是同样方式查找和编辑即可。

    防火墙问题,参考上述Mysql中防火墙配置进行处理。

    展开全文
  • Springboot搭建文件服务器

    万次阅读 2019-05-20 17:37:55
    笔者最近遇到了一个需求,需要搭建一个文件服务器,用于上传文件(.txt格式等)和图片(.jpg格式等)。 下面演示怎么上传txt文件和上传头像(.jpg),如有需要可自行修改后缀名进行拓展。 准备工作: 配置文件以及配置...

    笔者最近遇到了一个需求,需要搭建一个文件服务器,用于上传文件(.txt格式等)和图片(.jpg格式等)。

    下面演示怎么上传txt文件和上传头像(.jpg),如有需要可自行修改后缀名进行拓展。

    准备工作:

    配置文件以及配置类:主要配置不同类型的文件路径,比如上传头像,可以放到 avatar目录,上传不同类型的文件方便区分,并获取其指定的上传路径。

    配置文件application.yml:

    # 项目相关配置
    file-service:
      # 文件路径
      profile: D:/profile/
    

    这里我配置了默认文件路径在D:/profile/,这里要注意:自定义配置文件属性规范名称应为kebab-case(’ - '分隔),小写字母数字字符,并且必须以字母开头。也就是说 如果写 fileService 或 FileService都是错的。


    配置类WebConfig.java

    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;
    
    /**
     * 读取项目相关配置
     *
     * @author 健康搬砖人
     */
    @Component
    @ConfigurationProperties(prefix = "file-service")
    public class WebConfig {
    
        /**
         * 上传路径
         */
        private static String profile;
    
        public static String getProfile() {
            return profile;
        }
    
        public void setProfile(String profile) {
            WebConfig.profile = profile;
        }
        
        // 获取上传头像路径
        public static String getAvatarPath() {
            return profile + "avatar/";
        }
    	
        // 获取下载路径
        public static String getDownloadPath() {
            return profile + "download/";
        }
    	
        // 获取上传路径
        public static String getUploadPath() {
            return profile + "upload/";
        }
    }
    

    依赖文件:

    Pom.xml需要用到如下的依赖:

            <!--常用工具类 -->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
            </dependency>
    
            <!--io常用工具类 -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.5</version>
            </dependency>
    

    org.apache.commons这个是常用工具类,用于文件分类,后面我会写一个DateUtils,目的用于生成上传或下载的日期文件夹,比如上传个头像,目录可能是这样的

    D:/profile/avatar/2019/05/20/d025ba6f937f59999a021989a12a1aab.jpg
    

    其中的2019/05/20就是根据你上传或下载的日期而定。


    日期处理类

    import org.apache.commons.lang3.time.DateFormatUtils;
    
    import java.lang.management.ManagementFactory;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     * 时间工具类
     *
     * @author 健康搬砖人
     */
    public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
        public static String YYYY = "yyyy";
    
        public static String YYYY_MM = "yyyy-MM";
    
        public static String YYYY_MM_DD = "yyyy-MM-dd";
    
        public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
    
        public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    
        private static String[] parsePatterns = {
                "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
                "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
                "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
    
        /**
         * 获取当前Date型日期
         *
         * @return Date() 当前日期
         */
        public static Date getNowDate() {
            return new Date();
        }
    
        /**
         * 获取当前日期, 默认格式为yyyy-MM-dd
         *
         * @return String
         */
        public static String getDate() {
            return dateTimeNow(YYYY_MM_DD);
        }
    
        public static final String getTime() {
            return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
        }
    
        public static final String dateTimeNow() {
            return dateTimeNow(YYYYMMDDHHMMSS);
        }
    
        public static final String dateTimeNow(final String format) {
            return parseDateToStr(format, new Date());
        }
    
        public static final String dateTime(final Date date) {
            return parseDateToStr(YYYY_MM_DD, date);
        }
    
        public static final String parseDateToStr(final String format, final Date date) {
            return new SimpleDateFormat(format).format(date);
        }
    
        public static final Date dateTime(final String format, final String ts) {
            try {
                return new SimpleDateFormat(format).parse(ts);
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
        }
    
        /**
         * 日期路径 即年/月/日 如2018/08/08
         */
        public static final String datePath() {
            Date now = new Date();
            return DateFormatUtils.format(now, "yyyy/MM/dd");
        }
    
        /**
         * 日期路径 即年/月/日 如20180808
         */
        public static final String dateTime() {
            Date now = new Date();
            return DateFormatUtils.format(now, "yyyyMMdd");
        }
    
        /**
         * 日期型字符串转化为日期 格式
         */
        public static Date parseDate(Object str) {
            if (str == null) {
                return null;
            }
            try {
                return parseDate(str.toString(), parsePatterns);
            } catch (ParseException e) {
                return null;
            }
        }
    
        /**
         * 获取服务器启动时间
         */
        public static Date getServerStartDate() {
            long time = ManagementFactory.getRuntimeMXBean().getStartTime();
            return new Date(time);
        }
    
        /**
         * 计算两个时间差
         */
        public static String getDatePoor(Date endDate, Date nowDate) {
            long nd = 1000 * 24 * 60 * 60;
            long nh = 1000 * 60 * 60;
            long nm = 1000 * 60;
            // long ns = 1000;
            // 获得两个时间的毫秒时间差异
            long diff = endDate.getTime() - nowDate.getTime();
            // 计算差多少天
            long day = diff / nd;
            // 计算差多少小时
            long hour = diff % nd / nh;
            // 计算差多少分钟
            long min = diff % nd % nh / nm;
            // 计算差多少秒//输出结果
            // long sec = diff % nd % nh % nm / ns;
            return day + "天" + hour + "小时" + min + "分钟";
        }
    }
    

    MD5加密类:用于对文件名进行hash加密,防止上传的文件名相同。

    package com.warren.springboot.utils;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.security.MessageDigest;
    
    /**
     * Md5加密方法
     *
     * @author 健康搬砖人
     */
    public class Md5Utils {
        private static final Logger log = LoggerFactory.getLogger(Md5Utils.class);
    
        private static byte[] md5(String s) {
            MessageDigest algorithm;
            try {
                algorithm = MessageDigest.getInstance("MD5");
                algorithm.reset();
                algorithm.update(s.getBytes("UTF-8"));
                byte[] messageDigest = algorithm.digest();
                return messageDigest;
            } catch (Exception e) {
                log.error("MD5 Error...", e);
            }
            return null;
        }
    
        private static final String toHex(byte hash[]) {
            if (hash == null) {
                return null;
            }
            StringBuffer buf = new StringBuffer(hash.length * 2);
            int i;
    
            for (i = 0; i < hash.length; i++) {
                if ((hash[i] & 0xff) < 0x10) {
                    buf.append("0");
                }
                buf.append(Long.toString(hash[i] & 0xff, 16));
            }
            return buf.toString();
        }
    
        public static String hash(String s) {
            try {
                return new String(toHex(md5(s)).getBytes("UTF-8"), "UTF-8");
            } catch (Exception e) {
                log.error("not supported charset...{}", e);
                return s;
            }
        }
    }
    

    文件上传工具类

    import com.warren.springboot.config.WebConfig; //这个是导入上面的WebConfig.java配置文件
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.File;
    import java.io.IOException;
    
    /**
     * 文件上传工具类
     *
     * @author 健康搬砖人
     */
    public class FileUploadUtils {
        /**
         * 默认大小 50M
         */
        public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;
    
        /**
         * 默认的文件名最大长度 100
         */
        public static final int DEFAULT_FILE_NAME_LENGTH = 100;
    
        /**
         * 默认上传的地址
         */
        private static String defaultBaseDir = WebConfig.getProfile();
    
        /**
         * 默认文件类型jpg
         */
        public static final String IMAGE_JPG_EXTENSION = ".jpg";
    
        private static int counter = 0;
    
        public static void setDefaultBaseDir(String defaultBaseDir) {
            FileUploadUtils.defaultBaseDir = defaultBaseDir;
        }
    
        public static String getDefaultBaseDir() {
            return defaultBaseDir;
        }
    
        /**
         * 根据文件路径上传
         *
         * @param baseDir 相对应用的基目录
         * @param file    上传的文件
         * @return 文件名称
         * @throws IOException
         */
        public static final String uploadPicture(String baseDir, MultipartFile file) throws IOException {
            try {
                return upload(baseDir, file, FileUploadUtils.IMAGE_JPG_EXTENSION);
            } catch (Exception e) {
                throw new IOException(e.getMessage(), e);
            }
        }
    
        /**
         * 根据文件路径上传
         *
         * @param baseDir 相对应用的基目录
         * @param file    上传的文件
         * @return 文件名称
         * @throws IOException
         */
        public static final String uploadText(String baseDir, MultipartFile file) throws IOException {
            try {
                return upload(baseDir, file, ".txt");
            } catch (Exception e) {
                throw new IOException(e.getMessage(), e);
            }
        }
    
        /**
         * 文件上传
         *
         * @param baseDir   相对应用的基目录
         * @param file      上传的文件
         * @param extension 上传文件类型
         * @return 返回上传成功的文件名
         * @throws IOException 比如读写文件出错时
         */
        public static final String  upload(String baseDir, MultipartFile file, String extension) throws IOException{
    
            int fileNamelength = file.getOriginalFilename().length();
            if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) {
                // 此处可进行异常处理throws
                System.out.println("文件名长度超出限定长度");
            }
    
            assertAllowed(file);
    
            String fileName = extractFilename(file, extension);
    
            File desc = getAbsoluteFile(baseDir, baseDir + fileName);
            file.transferTo(desc);
            return fileName;
        }
    
        public static final String extractFilename(MultipartFile file, String extension) {
            String filename = file.getOriginalFilename();
            filename = DateUtils.datePath() + "/" + encodingFilename(filename) + extension;
            return filename;
        }
    
        private static final File getAbsoluteFile(String uploadDir, String filename) throws IOException {
            File desc = new File(File.separator + filename);
    
            if (!desc.getParentFile().exists()) {
                desc.getParentFile().mkdirs();
            }
            if (!desc.exists()) {
                desc.createNewFile();
            }
            return desc;
        }
    
        /**
         * 编码文件名
         */
        private static final String encodingFilename(String filename) {
            filename = filename.replace("_", " ");
            filename = Md5Utils.hash(filename + System.nanoTime() + counter++);
            return filename;
        }
    
        /**
         * 文件大小校验
         *
         * @param file 上传的文件
         */
        public static final void assertAllowed(MultipartFile file) {//throws FileSizeLimitExceededException {
            long size = file.getSize();
            if (size > DEFAULT_MAX_SIZE) {
                // 此处可进行异常处理throws
                System.out.println("文件大小超出最大限定大小");
            }
        }
    }
    

    准备工作就到这里结束了,下面直接就放大招了。

    项目实战

    一、文件上传
    
        /**
         * 保存文件
         *
         * @param file 文件
         * @return 结果
         */
        @PostMapping("/updateFile")
        @ResponseBody
        public Object updateFile(@RequestParam("file") MultipartFile file) {
            try {
                if (!file.isEmpty()) {
                    String fileName = FileUploadUtils.uploadText(WebConfig.getUploadPath(), file);
                    System.out.println("fileName:" + fileName);
                    // TODO: 此处可以根据项目需求的业务进行操作,例如将fileName保存到数据库
                }
                return "success";
            } catch (Exception e) {
                return "error";
            }
        }
    

    二、头像/图片上传

    图片上传和文件上传类似。

    	 /**
         * 保存头像
         *
         * @param file 头像文件
         * @return 结果
         */
        @PostMapping("/updateAvatar")
        @ResponseBody
        public Object updateAvatar(@RequestParam("avatarfile") MultipartFile file) {
            try {
                if (!file.isEmpty()) {
                    String avatar = FileUploadUtils.uploadPicture(WebConfig.getAvatarPath(), file);
                    System.out.println("avatar:" + avatar);
                    // TODO: 此处可以根据项目需求的业务进行操作,例如此处操作的是头像,可以将头像url保存到数据库,用户登录后,获取相应的url获取头像图片。
                }
                return "success";
            } catch (Exception e) {
                return "error";
            }
        }
    

    三、文件下载

    这里文件下载的业务分为几种。

    ①直接查看图片,类似业务:查看图片/查看头像

        /**
         * 查看文件
         *
         * @param url 图片url
         * @param response 请求响应
         */
        @RequestMapping(value = "/noLogin/readImageFile",method =RequestMethod.GET)
        @ResponseBody
        public void getUrlFile(String url, HttpServletResponse response) {
            // 这里的url,我为了测试,直接就写静态的。
            url = "D:/profile/avatar/2019/05/20/d025ba6f937f59999a021989a12a1aab.jpg";
            File file = new File(url);
            // 后缀名
            String suffixName = url.substring(url.lastIndexOf("."));
            //判断文件是否存在如果不存在就返回默认图片或者进行异常处理
            if (!(file.exists() && file.canRead())) {
    //            file = new File("xxx/xxx.jpg");
                System.out.println("文件不存在");
            }
            FileInputStream inputStream = null;
            try {
                inputStream = new FileInputStream(file);
                byte[] data = new byte[(int) file.length()];
                inputStream.close();
                response.setContentType("image/png;charset=utf-8");
                OutputStream stream = response.getOutputStream();
                stream.write(data);
                stream.flush();
                stream.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    

    效果如下:

    在这里插入图片描述


    ②将文件内容(.txt)封装到一个String里

        @RequestMapping(value = "/noLogin/readFileToString",method = RequestMethod.GET)
        @ResponseBody
        public String getUrlFile(String url, HttpServletRequest request, HttpServletResponse response) {
    //        url = "D:/profile/upload/2019/05/20/01017f12b88d9f4e79dc38060e3883da.txt";
    
            // 通过url创建文件
            File file = new File(url);
            // 后缀名
            String suffixName = url.substring(url.lastIndexOf("."));
            
            //判断文件是否存在如果不存在就进行异常处理
            if (!(file.exists() && file.canRead())) {
                System.out.println("文件不存在");
            }
    
            FileInputStream inputStream = null;
            String content = "";
            try {
                inputStream = new FileInputStream(file);
                inputStream.close();
                // 使用FileUtils将File内容以UTF-8的编码写到String里
                content = FileUtils.readFileToString(file, "UTF-8");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return content;
        }
    

    ③文件下载

        /**
         * 下载文件
         *
         * @param url 文件url
         * @param response 请求响应
         */
        @RequestMapping(value = "/noLogin/downloadFile",method =RequestMethod.GET)
        @ResponseBody
        public void getUrlDownload(String url, HttpServletResponse response) {
            url = "D:/profile/avatar/2019/05/20/d025ba6f937f59999a021989a12a1aab.jpg";
            File file = new File(url);
            // 后缀名
            String suffixName = url.substring(url.lastIndexOf("."));
            //判断文件是否存在如果不存在就进行异常处理
            if (!(file.exists() && file.canRead())) {
                System.out.println("文件不存在");
            }
            FileInputStream inputStream = null;
            BufferedInputStream bufferedInputStream = null;
            try {
                inputStream = new FileInputStream(file);
                byte[] data = new byte[(int) file.length()];
                int length = inputStream.read(data);
                inputStream.close();
                response.setContentType("application/force-download");
                //通过设置头信息给文件命名,也即是,在前端,文件流被接受完还原成原文件的时候会以你传递的文件名来命名
                response.addHeader("Content-Disposition",String.format("attachment; filename=\"%s\"", file.getName()));
                OutputStream stream = response.getOutputStream();
                stream.write(data);
                stream.flush();
                stream.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    

    效果如下:

    在这里插入图片描述

    展开全文
  • Java服务器开发搭建游戏基础框架

    千次阅读 2020-06-19 11:56:11
    Java服务器开发搭建游戏基础框架 最开始的项目是一个Maven构建的Java Web项目,使用Tomcat作为Web容器来提供服务。 上图是游戏的一个最基础架构的脑图,下面是对应搭建好项目的目录组织 下面讲解这基础的项目中...

    Java服务器开发之搭建游戏基础框架

    最开始的项目是一个Maven构建的Java Web项目,使用Tomcat作为Web容器来提供服务。
    

    在这里插入图片描述
    上图是游戏的一个最基础架构的脑图,下面是对应搭建好项目的目录组织

    在这里插入图片描述

    下面讲解这基础的项目中最最最重要的一个文件:web.xml文件

    当启动Web项目会先读取项目中的Web.xml配置文件。

    	<welcome-file-list>
    		<welcome-file>index.jsp</welcome-file>
    	</welcome-file-list>
    	
    	<listener>
    		<listener-class>com.server.core.boot.GameStartListener</listener-class>
    	</listener>
    
    	<servlet>
    		<servlet-name>CheckTokenServlet</servlet-name>
    		<servlet-class>com.server.core.login.CheckTokenServlet</servlet-class>
    		<load-on-startup>0</load-on-startup>
    	</servlet>
    
    	<servlet-mapping>
    		<servlet-name>CheckTokenServlet</servlet-name>
    		<url-pattern>/login/CheckToken</url-pattern>
    	</servlet-mapping>
    	
    	<servlet>
            <servlet-name>BackgroundManager</servlet-name>
            <servlet-class>com.server.game.backstage.BackgroundManager</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>BackgroundManager</servlet-name>
            <url-pattern>/background/*</url-pattern>
        </servlet-mapping>
    

    Web.xml的执行步骤:

    • 执行listener和context-param

      • 因此我们在Listener中将游戏启动起来,因此这里调用启动游戏的代码逻辑com.server.core.boot.GameStartListener
    • 接着容器创建一个ServeltContext,项目所有部分都将会共享这个上下文

      • 游戏项目中用不到这个,因此不做定义
    • 容器以context-param的name作为键,value作为值,将其转化为键值对,存入ServletContext

      • 同样用不到,不做定义
    • 容器创建listener中的类实例,根据配置的class类路径listener-class来创建监听,在监听中会有contextInitialized(ServletContextEvent args)初始化方法,启动Web应用时,系统调用Listener的该方法,在这个方法中获得context-param的值就是application.getInitParameter(“context-param的键”);得到这个context-param的值之后,你就可以做一些操作了。

      • 例子:你可能想在项目启动之前就打开数据库,那么这里就可以在context-param中设置数据库的连接方式(驱动、url、user、password),在监听类中初始化数据库的连接。这个监听是自己写的一个类,除了初始化方法,它还有销毁方法,用于关闭应用前释放资源。比如:说数据库连接的关闭,此时,调用contextDestroyed(ServletContextEvent args),关闭Web应用时,系统调用Listener的该方法。

      • 因此结合第一步,我们就会将游戏逻辑启动起来

        public class GameStartListener implements ServletContextListener {
        
        	@Override
        	public void contextInitialized(ServletContextEvent arg0) {
        		GameServer.start();
        	}
        
        	@Override
        	public void contextDestroyed(ServletContextEvent arg0) {
        		GameServer.stop();
        	}
        
        }
        
    • 接着,容器会读取filter,根据指定的类路径来实例化过滤器。

      • 游戏项目一般用不到,不做定义。
    • 以上都是在WEB项目还没有完全启动起来的时候就已经完成了的工作。如果系统中有Servlet,则Servlet是在第一次发起请求的时候被实例化的,而且一般不会被容器销毁,它可以服务于多个用户的请求。所以,Servlet的初始化都要比上面提到的那几个要迟。

      • 由于游戏项目中需要一些后台功能提供给运营后台来使用,因此游戏项目中也需要定义几个servlet

        • 后台管理servlet:BackgroundManager
        • 后台GMservlet:CheckTokenServlet

        servlet代码如下:

        public class BackgroundManager extends HttpServlet {
        
        	@Override
        	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        		doPost(req, resp);
        	}
        
        	@Override
        	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        		BackgroundService.getInstance().handle(req, resp);
        	}
        }
        

    总结

    1. 通过JavaWeb项目配置对应的web.xml的方式来作为容器将游戏项目启动起来。
      • 真正的游戏启动或关闭逻辑转到对应的管理类中
    2. 通过xml中定义的游戏启动逻辑以及后台查询管理类来管理后台对游戏的一些操作
      • 为后台提供一些基础的操作游戏逻辑功能

    通过上面的两部将可以简单的搭建起一个最基本的游戏项目。大家可以行动起来搭建看看。

    下一节的内容预告如下

    在这里插入图片描述

    展开全文
  • 四种方式搭建文件服务器

    万次阅读 2020-04-03 13:01:12
    准备搭建文件服务器来玩玩,百度了一圈,找到了主流的四种搭建服务器的方式,并且把它部署到了我的阿里云服务器上。 四种搭建文件服务器的方式: 第一种:Nginx自带的,autoIndex. 优点:配置快,开发速度最...
  • 写给大忙人看的 - Java中上传文件MinIO服务器(二)

    万次阅读 多人点赞 2020-05-10 18:25:48
    上一篇 写给大忙人看的 - 搭建文件服务器 MinIO(一),我们已经成功地搭建了 MinIO 文件服务器,这一篇讲解在 Java 中如何上传文件至 MinIO 一、开发前戏 1、项目中引入 maven 依赖 <!-- minio 相关依赖 --> ...
  • 自己动手——快速搭建Java应用服务器

    万次阅读 多人点赞 2017-05-08 11:33:17
    Motivation 我写这套帖子的目的,是在自己学会、实现...我在学习编写自己的Android应用程序服务器的时候遇到过以下的问题: 1.我需要准备什么? 2.我该选择哪一套实现方案? …… 这些问题的搜索和查证都...
  • 利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持缓存转发),这样开发的应用就不必依赖于互联网连接,也可以抛开NASA提供的数据源而独立运行。 1、准备工作 运行WWS服务器需要JDK、JOGL、GDAL包...
  • Java开发环境搭建超全详解

    千次阅读 多人点赞 2019-08-01 10:20:11
    在项目产品开发中,开发环境搭建是软件开发的首要阶段,也是必须阶段,只有开发环境搭建好了,方可进行开发,良好的开发环境搭建,为后续的开发工作带来极大便利。 对于大公司来说,软件开发环境搭建工作一般是由...
  • 基于Spring搭建文件服务器

    千次阅读 2018-10-27 15:26:13
    文件服务器搭建架构有很多种,如基于nginx+vsftp、nginx+fastDFS等架构,其中vsftp或fastDFS用于文件读写、上传存储、下载,nginx用于映射文件 ,方便http访问静态文件,实现在线预览图片或下载等功能。...
  • 其实就是花钱买块区域,服务器,域名,云解析,花了好多money。。。 一、租服务器 百度搜索阿里云 进入官网首页,点击登录 进入登录页面,可以使用邮箱登录或者注册 进入注册页面,填写注册信息 登录成功,进入...
  • 前端代码 window.location.href=this.context...+【文件路径】+"&amp;fileName="+【下载后的文件名】; java后台代码 private static FileSystemManager fsManager = null; static { try { ...
  • java 开发服务器

    千次阅读 2011-09-10 14:05:19
    本文将分以下几个部分来阐述我的方法: ...3、 怎样规划服务器的目录及命名规范、开发代号? 4、 原型的开发(-): 怎样设计服务器的代码骨架? 5、 原型的开发(二): 怎样测试您的代码骨架? 6、 详细的
  • java开发服务器端开发

    千次阅读 2017-04-14 19:27:04
    第二种: 服务器开发 第一个阶段是连接器设计,主要涉及到涉及到网络知识(阻塞式socket和非阻塞式socket)、通信模式(TCP/IP或者UDP)、网络管理(负载、连接状态等)、传输协议设计(特别与其他语言的交互)、I/...
  • java搭建本地服务器,android客户端访问,tomcat详细步骤代码都在这里,先可以不用下这个,跟着下面先把环境搭好,出问题再来看代码:https://download.csdn.net/download/qq_31939617/10275515eclispe64位,直接...
  • javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 ...javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG) javaCV开发详解之4:转流器实现(也可作...
  • 接上篇文章,本章节讲述使用java语言的ckeditor服务器文件浏览功能。 // 虽然两篇文章的代码都带有文件类型参数,但是此处不进行判断非法格式,仅以图片类型为主介绍控件功能的开发过程。 上篇文章...
  • 服务器搭建java服务器运行环境

    千次阅读 2018-09-26 20:22:08
    通过ftp上传文件服务器。 解压jdk tar -zxvf jdk-8u181-linux-x64.tar.gz 配置环境变量 如果你用的是服务器普通用户,编辑 ~/.bashrc 文件,修改环境变量。 在文件的最后添加如下配置,将 JAVA_HOME ...
  • 3服务器搭建 下一篇php服务器 通过tomcat搭建java服务器(linux1、java环境搭建java环境较容易搭建,在网上很容易找到相关的教程。2、tomcat环境搭建参考自百度经验的 http://jingyan.baidu.com/arti
  • java服务器开发心得

    万次阅读 多人点赞 2009-08-25 21:37:00
    本人已从事java服务器开发三年多了,对java服务器开发比较有心得,特此对这三年多来进行下技术总结,并与大家分享。 作为服务器开发,对基础知识的掌握程度,将决定你的服务器各方面的能力,一般在进行java服务器...
  • 前言: ...这里我设想用Lua+Java来实现服务器的热更,不成熟的想法,这里想尝试一下Lua和Java如何互相调用。 插件选择:假如引入第三方库,可以找到比较常用的两个选择:LuaJava和LuaJ,简单做一下对比:
  • 注:云服务器开发环境如下 (CentOS + JDK1.7 + Mysql + ZooKeeper + Redis + Nginx + maven中央库Nexus)一、购买阿里云服务器 1、百度搜索阿里云官网或地址栏输入 https://www.aliyun.com 进入阿里云官网,登录...
  • java搭建自己的http服务器

    千次阅读 2017-04-24 15:40:43
    侵权立删 ...浏览器打开网页可以简单分为三个阶段: ...1、通过socket向服务器发送一个一定格式的请求...2、服务器收到浏览器的请求字符串,解析出用户所请求的网址,网址其实对应的说服务器中的文件。即相应的htm
  • 还是在12.12号,遇到了一个奇怪的问题,...问题是,有线网和无线网情况下,通过ftp下载服务器中的文件,开着防火墙的时候,无线网情况下下载不成功,但并未报错;有线网则可以正常运行。关了防火墙的话,都可以运行正常
  • 现在有一个项目,这个项目的页面、业务、图片分散在3个不同端口的服务中 前端开发时需要区分这三个服务的不同端口发送请求 ...页面、静态文件以及业务由新服务器分配 对了,我没有服务端的源码
  • java游戏服务器开发之三--日志

    万次阅读 2018-06-10 20:23:17
    日志在一个系统中的重要性还是很大的,有时候项目部署到服务器上,不可能使用断点调试的方式,只能从日志文件中查找蛛丝马迹。 这边是使用的slf4j。  在pom文件中添加slf4j &lt;!-- 日志包 --&gt; &...
  • JAVA敏捷开发环境搭建

    千次阅读 2016-05-19 18:06:10
    前面介绍了创业型软件公司的工作模式,这里详细介绍下如何实施,第一步是先要搭建环境,有了环境才能开展工作。 整个软件项目分为四个环境 开发本地环境、开发环境、测试环境、IDC环境。和传统C++开发不一样的模式...
  • Windows Server搭建Tomcat服务器Java项目应用 本文主要介绍使用阿里云Windows Server搭建Tomcat服务器Java项目应用,将文章写下来以后自己也可以及时看看。 工具和软件 服务器:阿里云Windows Server...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 555,661
精华内容 222,264
关键字:

java开发如何搭建文件服务器

java 订阅