34分布式电商项目 - 商品录入(图片上传至fastdfs)

简介: 34分布式电商项目 - 商品录入(图片上传至fastdfs)

上传图片至fastdfs

后端代码

1.pinyougou-common 工程 pom.xml 引入依赖

<!-- 文件上传组件 -->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
    </dependency>
    <dependency>
      <groupId>org.csource.fastdfs</groupId>
      <artifactId>fastdfs</artifactId>
    </dependency>

2.编写工具类 FastDFSClient.java

package com.pyg.utils;
public class FastDFSClient {
  private TrackerClient trackerClient = null;
  private TrackerServer trackerServer = null;
  private StorageServer storageServer = null;
  private StorageClient1 storageClient = null;
  public FastDFSClient(String conf) throws Exception {
    if (conf.contains("classpath:")) {
      conf = conf.replace("classpath:", this.getClass().getResource("/").getPath());
    }
    ClientGlobal.init(conf);
    trackerClient = new TrackerClient();
    trackerServer = trackerClient.getConnection();
    storageServer = null;
    storageClient = new StorageClient1(trackerServer, storageServer);
  }
  /**
   * 上传文件方法
   * <p>Title: uploadFile</p>
   * <p>Description: </p>
   * @param fileName 文件全路径
   * @param extName 文件扩展名,不包含(.)
   * @param metas 文件扩展信息
   * @return
   * @throws Exception
   */
  public String uploadFile(String fileName, String extName, NameValuePair[] metas) throws Exception {
    String result = storageClient.upload_file1(fileName, extName, metas);
    return result;
  }
  public String uploadFile(String fileName) throws Exception {
    return uploadFile(fileName, null, null);
  }
  public String uploadFile(String fileName, String extName) throws Exception {
    return uploadFile(fileName, extName, null);
  }
  /**
   * 上传文件方法
   * <p>Title: uploadFile</p>
   * <p>Description: </p>
   * @param fileContent 文件的内容,字节数组
   * @param extName 文件扩展名
   * @param metas 文件扩展信息
   * @return
   * @throws Exception
   */
  public String uploadFile(byte[] fileContent, String extName, NameValuePair[] metas) throws Exception {
    String result = storageClient.upload_file1(fileContent, extName, metas);
    return result;
  }
  public String uploadFile(byte[] fileContent) throws Exception {
    return uploadFile(fileContent, null, null);
  }
  public String uploadFile(byte[] fileContent, String extName) throws Exception {
    return uploadFile(fileContent, extName, null);
  }
}

3.把fdfs_client.conf文件拷贝到pinyougou-shop-web

工程 config 文件夹中。

4.在 pinyougou-shop-web 工程 application.properties 添加配置

5.在 pinyougou-shop-web 工程 springmvc.xml 添加配置:

<!-- 配置文件上传支持 -->
  <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 支持上传文件大小  -->
    <property name="maxUploadSize" value="1024000000"></property>
  </bean>

6.在 pinyougou-shop-web 新建 UploadController.java

@RestController
@RequestMapping("/shop")
public class UploadController {
  //注入常量配置
  @Value("${IMAGE_SERVER_URL}")
  private String IMAGE_SERVER_URL;
  /**
   * 需求:商家上传图片
   * 请求:upload
   * 参数:MultipartFile
   * 返回值:PygResult
   */
  @RequestMapping("/upload")
  public PygResult uploadPic(MultipartFile file){
    try {
      //获取文件名称
      String originalFilename = file.getOriginalFilename();
      //截取文件扩展名 
      String extName = originalFilename.substring(originalFilename.lastIndexOf(".")+1);
      //创建工具类对象
      FastDFSClient fdfs = new FastDFSClient("classpath:config/client.conf");
      //上传文件
      //gif,bmp,jpg
      //返回文件上传成功地址:group1/M00/00/02/wKhCQ1qvKG2AZqibAA1rIuRd3Es806.jpg
      String url = fdfs.uploadFile(file.getBytes(), extName);
      //组合图片上传成功绝对地址
      url = IMAGE_SERVER_URL+url;
      //上传成功
      return new PygResult(true, url);
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      //上传失败
      return new PygResult(false, "上传失败");
    }
  }
}

前端代码

1.在 pinyougou-shop-web 工程创建 uploadService.js

//文件上传服务层
app.service("uploadService",function($http){
  this.uploadFile=function(){
    var formData=new FormData();
    formData.append("file",file.files[0]); 
    return $http({
       method:'POST',
       url:"../upload.do",
       data: formData,
       headers: {'Content-Type':undefined},
       transformRequest: angular.identity
     });
  }
});

anjularjs 对于 post 和 get 请求默认的 Content-Type header 是 application/json。通过设置‘Content-Type’: undefined,这样浏览器会帮我们把 Content-Type 设置为 multipart/form-data.

通过设置 transformRequest: angular.identity ,anjularjs transformRequest function 将序列化我们的 formdata object.

2.将 uploadService 服务注入到 goodsController 中

//商品控制层(商家后台)
app.controller('goodsController' ,function($scope,$controller ,goodsService,itemCatService,uploadService){

3.在 goods_edit.html 引入 js

<script type="text/javascript" src="../js/base.js"> </script>
<script type="text/javascript" src="../js/service/goodsService.js"> </script>
<script type="text/javascript" src="../js/service/itemCatService.js"> </script>
<script type="text/javascript" src="../js/service/uploadService.js"> </script>
<script type="text/javascript" src="../js/controller/baseController.js"> </script>
<script type="text/javascript" src="../js/controller/goodsController.js"> </script>

4.上传图片,goodsController 编写代码

/**
* 上传图片
*/
$scope.uploadFile=function(){ 
  uploadService.uploadFile().success(function(response) { 
     if(response.success){//如果上传成功,取出 url
     $scope.image_entity.url=response.message;//设置文件地址
   }else{
     alert(response.message);
   }
   }).error(function() {
      alert("上传发生错误");
    }); 
  };

5.修改图片上传窗口,调用上传方法,回显上传图片

<div class="modal-body">
<table class="table table-bordered table-striped">
  <tr>
    <td>颜色</td>
    <td><input class="form-control" placeholder="颜色"
  ng-model="image_entity.color"> </td>
  </tr>  
  <tr>
    <td>商品图片</td>
    <td>
  <table>
    <tr>
    <td>
    <input type="file" id="file" />  
      <button class="btn btn-primary" type="button"
    ng-click="uploadFile()">
      上传
      </button>
      </td>
      <td>
    <img src="{{image_entity.url}}" width="200px"
    height="200px">
    </td>
    </tr>
  </table>
  </td>
  </tr>  
</table>
</div>



目录
相关文章
|
安全 开发工具 git
git分布式版本控制系统及在码云上创建项目并pull和push
通过本文的介绍,我们详细讲解了Git的基本概念和工作流程,并展示了如何在码云上创建项目及进行pull和push操作。Git作为一种分布式版本控制系统,为开发者提供了强大的工具来管理代码变更和协作开发。希望本文能帮助您更好地理解和使用Git及码云,提高开发效率和代码质量。
740 18
|
安全 开发工具 git
git分布式版本控制系统及在码云上创建项目并pull和push
通过本文的介绍,我们详细讲解了Git的基本概念和工作流程,并展示了如何在码云上创建项目及进行pull和push操作。Git作为一种分布式版本控制系统,为开发者提供了强大的工具来管理代码变更和协作开发。希望本文能帮助您更好地理解和使用Git及码云,提高开发效率和代码质量。
474 16
|
NoSQL Java Redis
面试官:项目中如何实现分布式锁?
面试官:项目中如何实现分布式锁?
683 7
面试官:项目中如何实现分布式锁?
|
资源调度 Java 调度
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
315 0
项目环境测试问题之Schedulerx2.0通过分布式分片任务解决单机计算瓶颈如何解决
|
SQL NoSQL Java
如何在Java项目中实现分布式锁
如何在Java项目中实现分布式锁
|
存储 缓存 开发框架
看看 Asp.net core Webapi 项目如何优雅地使用分布式缓存
看看 Asp.net core Webapi 项目如何优雅地使用分布式缓存
328 0
|
消息中间件 Java 中间件
如何在Java项目中实现分布式事务管理
如何在Java项目中实现分布式事务管理
|
10月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
675 2
|
10月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
774 6
|
11月前
|
存储 缓存 NoSQL
Redis核心数据结构与分布式锁实现详解
Redis 是高性能键值数据库,支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,广泛用于缓存、消息队列和实时数据处理。本文详解其核心数据结构及分布式锁实现,帮助开发者提升系统性能与并发控制能力。