分布式上传商品案例

ewfdaswdadasd一:首先搭建好一个分布式框架

Dubbo 框架搭建一个passport案例_asmall_cat的博客-CSDN博客

二:搭建一个上架商品服务

三:上传文件

通过一个上传下载帮助类来实现:

package com.dubbo.commos;

import java.io.*;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;



public class FtpUtil {
    /** 本地字符编码 */
    private static String LOCAL_CHARSET = "GBK";

    // FTP协议里面,规定文件名编码为UTF-8
    private static String SERVER_CHARSET = "UTF-8";
    /**
     * 获取FTPClient对象
     * @param ftpHost FTP主机服务器
     * @param ftpPassword FTP 登录密码
     * @param ftpUserName FTP登录用户名
     * @param ftpPort FTP端口 默认为21
     * @return
     */

    public static FTPClient getFTPClient(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword) {
        FTPClient ftpClient = null;
        try {
            ftpClient = new FTPClient();
            ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
            ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                System.out.println("未连接到FTP,用户名或密码错误。");
                ftpClient.disconnect();
            } else {
                System.out.println("FTP连接成功。");
            }
        } catch (SocketException e) {
            e.printStackTrace();
            System.out.println("FTP的IP地址可能错误,请正确配置。");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("FTP的端口错误,请正确配置。");
        }
        return ftpClient;
    }
    /**
     * 往FTP服务器上传文件
     * @param ftpHost FTP IP地址
     * @param ftpUserName FTP 用户名
     * @param ftpPassword FTP用户名密码
     * @param ftpPort FTP端口
     * @param basePath FTP服务器中文件所在路径 格式: /homt/ftpuser/images/
     * @param filePath 上传文件到服务器中的子目录 格式:H:/日期格式
     * @param filename 文件名称
     * @param input 文件流
    */
    public static boolean uploadFile(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword,
                                     String basePath, String filePath, String filename, InputStream input) {
        boolean result = false;
        FTPClient ftpClient = null;
        try {
            int reply;
            ftpClient = getFTPClient(ftpHost, ftpPort, ftpUserName, ftpPassword);
            reply = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
                return result;
            }
            // 切换到上传目录
            if (!ftpClient.changeWorkingDirectory(basePath + filePath)) {
                // 如果目录不存在创建目录
                String[] dirs = filePath.split("/");
                String tempPath = basePath;
                for (String dir : dirs) {
                    if (null == dir || "".equals(dir))
                        continue;
                    tempPath += "/" + dir;
                    if (!ftpClient.changeWorkingDirectory(tempPath)) {
                        if (!ftpClient.makeDirectory(tempPath)) {
                            return result;
                        } else {
                            ftpClient.changeWorkingDirectory(tempPath);
                        }
                    }
                }
            }
            // 设置上传文件的类型为二进制类型
            if (FTPReply.isPositiveCompletion(ftpClient.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
                LOCAL_CHARSET = "UTF-8";
            }
            ftpClient.setControlEncoding(LOCAL_CHARSET);
            ftpClient.enterLocalPassiveMode();// 设置被动模式
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);// 设置传输的模式
            // 上传文件
            filename = new String(filename.getBytes(LOCAL_CHARSET), SERVER_CHARSET);
            if (!ftpClient.storeFile(filename, input)) {
                return result;
            }

            if(null != input){
                input.close();
            }

            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    //退出登录
                    ftpClient.logout();
                    //关闭连接
                    ftpClient.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }

    /**
     * Description: 从FTP服务器下载文件
     * @param host FTP服务器hostname
     * @param port FTP服务器端口
     * @param username FTP登录账号
     * @param password FTP登录密码
     * @param remotePath FTP服务器上的相对路径
     * @param fileName 要下载的文件名
     * @param localPath 下载后保存到本地的路径
     * @return
     */
    public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
                                       String fileName, String localPath) {
        boolean result = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(host, port);
            // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
            ftp.login(username, password);// 登录
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                return result;
            }
            ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
            FTPFile[] fs = ftp.listFiles();
            for (FTPFile ff : fs) {
                if (ff.getName().equals(fileName)) {
                    File localFile = new File(localPath + "/" + ff.getName());

                    OutputStream is = new FileOutputStream(localFile);
                    ftp.retrieveFile(ff.getName(), is);
                    is.close();
                }
            }

            ftp.logout();
            result = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return result;
    }

    public static void main(String[] args) throws FileNotFoundException {

      //  FileInputStream in=  new FileInputStream("e:/1.jpg");
        //测试上传
       // boolean flag = FtpUtil.uploadFile("192.168.160.139", 21, "ftpuser", "ftpuser", "/home/ftpuser/images","/20220421", "1.jpg", in);
       // System.out.println(flag);

        //测试下载
//       FtpUtil.downloadFile("192.168.160.149",21,"ftpuser", "ftpuser","/home/ftpuser/images/20210709","1.jpg","d:/");
    }

}
<!--上传下载依赖-->
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
        </dependency>
    </dependencies>

jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<html>
<head>
    <base href="<%=basePath%>">
        <meta charset="UTF-8">
        <title>发布商品</title>
        <link href="css/common.css" rel="stylesheet" type="text/css"/>
        <link href="css/style.css" rel="stylesheet" type="text/css"/>
        <link href="css/jquery-labelauty.css" rel="stylesheet" type="text/css"/>
        <link rel="stylesheet" type="text/css" href="css/jd.css"/>
        <script src="js/jquery-1.8.3.min.js" type="text/javascript"></script>
        <script src="js/jquery.SuperSlide.2.1.1.js" type="text/javascript"></script>
        <script src="js/common_js.js" type="text/javascript"></script>
        <script src="js/footer.js" type="text/javascript"></script>
        <script src="kindeditor/kindeditor-min.js" type="text/javascript"></script>
        <script src="js/jquery-labelauty.js" type="text/javascript"></script>
        <script>
            KindEditor.ready(function (K) {
                var obj;
                obj = K.create('#disc', {
                    uploadJson: 'uploadFile',
                    filePostName: 'mf',
                    dir: 'image'
                });
                obj.sync();
            });
        </script>
    </head>
<body>
<!--头部log-->
<div class="heart">
    <div class="log">
        <img src="images/logo-201305-b.png"/>

    </div>

</div>
<!--提示-->
<div class="nav">
</div>
<!--提示-->
<!--发布商品样式-->
<div class="Inside_pages clearfix">
    <div class="left_style">
        <!--列表-->
        <div class="menu_style">
            <ul class="menu_list">
                <li><em></em><a href="店铺专区.html">店铺专区</a></li>
                <li class="on"><em></em><a href="商品专区.html">商品专区</a></li>
                <li><em></em><a href="#">订单专区</a></li>
                <li><em></em><a href="#">发货管理</a></li>
                <li><em></em><a href="#">收款账户</a></li>
                <li><em></em><a href="#">我的报表</a></li>
            </ul>
        </div>
    </div>
    <div class="right_style">
        <!--内容详细-->
        <div class="title_style"><em></em>发布商品</div>
        <div class="content_style">
            <div class="Release_product_style">
                <form action="addProduct" method="post">
                    <table cellpadding="0" cellspacing="0" width="100%">
                        <tr>
                            <td class="label">店铺/公司名称:</td>
                            <td>奶茶妹家的旗舰店</td>
                        </tr>
                        <tr>
                            <td class="label">商品标题:</td>
                            <td><input name="title" type="text" class="addtext"
                                       style="width:500px;"/></td>
                        </tr>
                        <tr>
                            <td class="label">设置商品分类:</td>
                            <td>
                                <span>一级分类:</span><select name="group1" size="1">
                                <option value="0" selected="selected">一级分类</option>
                                <option value="1">3C数码</option>
                                <option value="2">电脑/办公</option>
                                <option value="3">家具/家装</option>
                                <option value="4">男装/女装</option>
                                <option value="5">食品区</option>
                                <option value="6">其他</option>
                            </select>
                                <span>二级分类:</span><select name="group2" size="1">
                                <option value="0">二级分类</option>
                                <option value="11">手机</option>
                                <option value="22">数码</option>
                                <option value="33">数码配件</option>
                                <option value="44">电脑整机</option>
                                <option value="55">电脑外设配件</option>
                                <option value="66">饮料类</option>
                                <option value="77">农产品</option>
                                <option value="88">其他</option>
                            </select>
                                <span>三级分类:</span>
                                <select name="group3" size="1">
                                    <option value="0">三级分类</option>
                                    <option value="111">智能手机</option>
                                    <option value="222">老人手机</option>
                                    <option value="333">台式机</option>
                                    <option value="444">笔记本</option>
                                    <option value="555">商务装</option>
                                    <option value="666">休闲装</option>
                                    <option value="777">酒水/饮料</option>
                                    <option value="888">生鲜/水果</option>
                                    <option value="999">其他</option>
                                </select>
                            </td>
                        </tr>
                        <tr>
                            <td class="label">商品销售价格:</td>
                            <td><input name="price" type="text" class="addtext"
                                       style=" width:200px;"/>
                            </td>
                        </tr>

                        <tr>
                            <td class="label">商品卖点介绍:</td>
                            <td>
                                <textarea name="sellpoint" cols="" rows="" placeholder="商品的卖点,该信息将出现在商品名称下方。"
                                          class="textarea"></textarea>
                            </td>
                        </tr>

                        <tr>
                            <td class="label">商品详细介绍:</td>
                            <td>
                                <textarea name="detail" id="disc" placeholder="这里写商品的描述" style="width: 800px;height: 300px">
                                </textarea>
                            </td>
                        </tr>

                    </table>
                    <a class="Next_btn">&nbsp;&nbsp;</a>
                    <input type="submit" value="提交新增商品" style="color:white;font-size: 18px;background-color: #E4393C;width: 220px;height: 40px;
                    position: relative;left: 390px;top: -40px;border: 1px red solid;"/>

                </form>
            </div>
        </div>
    </div>
</div>

<!--网站地图-->
<div class="fri-link-bg clearfix">
    <div class="fri-link">
        <div class="logo left margin-r20"><img src="images/fo-logo.jpg" width="152" height="81"/></div>
        <div class="left"><img src="images/qd.jpg" width="90" height="90"/>
            <p>扫描下载APP</p>
        </div>
        <div class="">
            <dl>
                <dt>新手上路</dt>
                <dd><a href="#">售后流程</a></dd>
                <dd><a href="#">购物流程</a></dd>
                <dd><a href="#">订购方式</a></dd>
                <dd><a href="#">隐私声明 </a></dd>
                <dd><a href="#">推荐分享说明 </a></dd>
            </dl>
            <dl>
                <dt>配送与支付</dt>
                <dd><a href="#">保险需求测试</a></dd>
                <dd><a href="#">专题及活动</a></dd>
                <dd><a href="#">挑选保险产品</a></dd>
                <dd><a href="#">常见问题 </a></dd>
            </dl>
            <dl>
                <dt>售后保障</dt>
                <dd><a href="#">保险需求测试</a></dd>
                <dd><a href="#">专题及活动</a></dd>
                <dd><a href="#">挑选保险产品</a></dd>
                <dd><a href="#">常见问题 </a></dd>
            </dl>
            <dl>
                <dt>支付方式</dt>
                <dd><a href="#">保险需求测试</a></dd>
                <dd><a href="#">专题及活动</a></dd>
                <dd><a href="#">挑选保险产品</a></dd>
                <dd><a href="#">常见问题 </a></dd>
            </dl>
            <dl>
                <dt>帮助中心</dt>
                <dd><a href="#">保险需求测试</a></dd>
                <dd><a href="#">专题及活动</a></dd>
                <dd><a href="#">挑选保险产品</a></dd>
                <dd><a href="#">常见问题 </a></dd>
            </dl>
            <dl>
                <dt>帮助中心</dt>
                <dd><a href="#">保险需求测试</a></dd>
                <dd><a href="#">专题及活动</a></dd>
                <dd><a href="#">挑选保险产品</a></dd>
                <dd><a href="#">常见问题 </a></dd>
            </dl>
            <dl>
                <dt>帮助中心</dt>
                <dd><a href="#">保险需求测试</a></dd>
                <dd><a href="#">专题及活动</a></dd>
                <dd><a href="#">挑选保险产品</a></dd>
                <dd><a href="#">常见问题 </a></dd>
            </dl>
        </div>
    </div>
</div>
<!--网站地图END-->
<!--网站页脚-->
<div class="copyright">
    <div class="copyright-bg">
        <div class="hotline">为生活充电在线 <span>招商热线:****-********</span> 客服热线:400-******</div>
        <div class="hotline co-ph">
            <p>版权所有Copyright ©Teacher:Sailing</p>
            <p>*ICP备***************号 不良信息举报</p>
            <p>总机电话:****-*********/194/195/196 客服电话:4000****** 传 真:********

                E-mail:****@****.gov.cn</p>
        </div>
    </div>
</div>
</body>
</html>

 四:上架商品服务

pojo层:注意状态码0上架1下架

package com.dubbo.pojo;

import java.io.Serializable;


public class Product implements Serializable {
    private int pid;
    private String title;
    private String group1;
    private String group2;
    private String group3;
    private double price;
    private String sellpoint;
    private String detail;
    private String imagepath;
    private int status;//1上架,0下架

    public String getImagepath() {
        return imagepath;
    }

    public void setImagepath(String imagepath) {
        this.imagepath = imagepath;
    }

    public int getPid() {
        return pid;
    }

    public void setPid(int pid) {
        this.pid = pid;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getGroup1() {
        return group1;
    }

    public void setGroup1(String group1) {
        this.group1 = group1;
    }

    public String getGroup2() {
        return group2;
    }

    public void setGroup2(String group2) {
        this.group2 = group2;
    }

    public String getGroup3() {
        return group3;
    }

    public void setGroup3(String group3) {
        this.group3 = group3;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getSellpoint() {
        return sellpoint;
    }

    public void setSellpoint(String sellpoint) {
        this.sellpoint = sellpoint;
    }

    public String getDetail() {
        return detail;
    }

    public void setDetail(String detail) {
        this.detail = detail;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return "Product{" +
                "pid=" + pid +
                ", title='" + title + '\'' +
                ", group1='" + group1 + '\'' +
                ", group2='" + group2 + '\'' +
                ", group3='" + group3 + '\'' +
                ", price=" + price +
                ", sellpoint='" + sellpoint + '\'' +
                ", detail='" + detail + '\'' +
                ", imagePath='" + imagepath + '\'' +
                ", status=" + status +
                '}';
    }
}

product层:

        setrvice层:     

package com.dubbo.service;

import com.dubbo.pojo.Product;


public interface ProductService {
    public int addProduct(Product product);
}

                serviceImp层:

package com.dubbo.service.impl;

import com.dubbo.ProductServiceApi;
import com.dubbo.pojo.Product;
import com.dubbo.service.ProductService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;

//这是spring的service
@Service
public class ProductServiceImpl implements ProductService {
    //订阅远程服务
    @Reference
    private ProductServiceApi productServiceApi;
    
    //通过订阅服务里api的接口把前端页面封装好的对象放进注册好的服务中查询,并返回结果1或0;
    @Override
    public int addProduct(Product product) {
        return productServiceApi.addProduct(product);
    }
}

        controller层:

  /**
     * 上架商品
     */
    @RequestMapping(value = "/addProduct",produces = "text/html;charset=utf-8")
    @ResponseBody
    public String addProduct(Product product){
        product.setImagepath(imagePath);
        //写入数据库
        int i = productService.addProduct(product);
        if(i ==1){
            return "上架成功";
        }else{
            return "上架失败";
        }
    }

mapper层

package com.dubbo.mapper;

import com.dubbo.pojo.Product;
import org.apache.ibatis.annotations.Insert;


public interface ProductMapper {
    @Insert("insert into product values(null,#{title},#{group1},#{group2},#{group3},#{price},#{sellpoint},#{imagepath},0)")
    public int addProduct(Product product);
}

api层

package com.dubbo;

import com.dubbo.pojo.Product;


public interface ProductServiceApi {
    public int addProduct(Product product);
}

provider层:

        service层

package com.dubbo.provider.service.impl;

import com.dubbo.ProductServiceApi;
import com.dubbo.mapper.ProductMapper;
import com.dubbo.pojo.Product;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;

//注意:这一定是dubbo的service是用来开启服务器时上传服务的@Service
@Service

//直接实现了api接口,偷懒少写了一层接口(效果都一样)
public class ProductServiceImpl implements ProductServiceApi {
    //注入mapper层把前端的封装上架对象查询
    @Autowired
    private ProductMapper productMapper;
    @Override
    public int addProduct(Product product) {
        return productMapper.addProduct(product);
    }
}

五:运行 

        打开linux系统开启zookeeper

        运行上架商品的服务

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值