學成在線--23.課程圖片管理(上傳圖片)

文章目錄

  • 一. 需求分析
      • 1). 需求分析
      • 2). 圖片上傳流程
  • 二. 創建文件系統服務工程
      • 1). 工程目錄結構
      • 2). 項目依賴pom.xml
      • 3). 配置文件application.yml
  • 三. 后端開發
    • 1. 模型類
      • 1). 模型類
      • 2). Collection
    • 2. Api接口
    • 3. Dao
    • 4. Service
    • 5. Controller
    • 6. 測試
  • 四. 前端開發
    • 1. 需求
    • 2. 頁面
      • 1). Template
      • 2). 數據模型

一. 需求分析

1). 需求分析

在很多系統都有上傳圖片/上傳文件的需求,比如:上傳課程圖片、上傳課程資料、上傳用戶頭像等;

為了提供系統的可重用性,專門設立文件系統服務承擔圖片/文件的管理,文件系統服務實現對文件的上傳、刪除、查詢等功能進行管理;

各個子系統不再開發上傳文件的請求,通過文件系統服務進行文件的上傳、刪除等操作;

文件系統服務最終會將文件存儲到fastDSF文件系統中。

下圖是各個子系統與文件系統服務之間的關系:
在這里插入圖片描述

2). 圖片上傳流程

其中,課程管理服務中上傳圖片處理流程如下:
在這里插入圖片描述

執行流程如下:
1、管理員進入教學管理前端,點擊上傳圖片
2、圖片上傳至文件系統服務,文件系統請求fastDFS上傳文件
3、文件系統將文件入庫,存儲到文件系統服務數據庫中。
4、文件系統服務向前端返回文件上傳結果,如果成功則包括文件的Url路徑。

5、課程管理前端請求課程管理服務進行保存課程圖片信息到課程數據庫。
6、課程管理服務將課程和圖片保存在課程數據庫。

二. 創建文件系統服務工程

1). 工程目錄結構

在這里插入圖片描述

2). 項目依賴pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>xc-framework-parent</artifactId><groupId>com.xuecheng</groupId><version>1.0-SNAPSHOT</version><relativePath>../xc-framework-parent/pom.xml</relativePath></parent><modelVersion>4.0.0</modelVersion><artifactId>xc-service-base-filesystem</artifactId><dependencies><dependency><groupId>com.xuecheng</groupId><artifactId>xc-service-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.xuecheng</groupId><artifactId>xc-framework-model</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.xuecheng</groupId><artifactId>xc-framework-common</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>net.oschina.zcx7878</groupId><artifactId>fastdfs-client-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency></dependencies></project>

3). 配置文件application.yml

server:port: 22100
spring:application:name: xc-service-base-filesystem
#mongo配置data:mongodb:database: xc_fsuri: mongodb://root:123@127.0.0.1:27017
#SpringMVC上傳文件配置servlet:multipart:#默認支持文件上傳.enabled: true#支持文件寫入磁盤.file-size-threshold: 0# 上傳文件的臨時目錄location:# 最大支持文件大小max-file-size: 1MB# 最大支持請求大小max-request-size: 30MB
xuecheng:fastdfs:connect_timeout_in_seconds: 5network_timeout_in_seconds: 30charset: UTF-8tracker_servers: 192.168.101.65:22122 #多個 trackerServer中間以逗號分隔

三. 后端開發

1. 模型類

1). 模型類

系統的文件信息(圖片、文檔等小文件的信息)在mongodb中存儲,下邊是文件信息的模型類

package com.xuecheng.framework.domain.filesystem;import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;import java.util.Map;@Data
@ToString
@Document(collection = "filesystem")
public class FileSystem {@Idprivate String fileId;//文件請求路徑private String filePath;//文件大小private long fileSize;//文件名稱private String fileName;//文件類型private String fileType;//圖片寬度private int fileWidth;//圖片高度private int fileHeight;//用戶id,用于授權private String userId;//業務keyprivate String businesskey;//業務標簽private String filetag;//文件元信息private Map metadata;}

說明:

fileId:fastDFS返回的文件ID。

filePath:請求fastDFS瀏覽文件URL。

businesskey:文件系統服務為其它子系統提供的一個業務標識字段,各子系統根據自己的需求去使用,比如:課
程管理會在此字段中存儲課程id用于標識該圖片屬于哪個課程。

filetag:文件標簽,由于文件系統服務是公共服務,文件系統服務會為使用文件系統服務的子系統分配文件標簽,
用于標識此文件來自哪個系統。

metadata:文件相關的元信息。

2). Collection

在mongodb創建數據庫xc_fs(文件系統數據庫),并創建集合 filesystem。

在這里插入圖片描述

2. Api接口

文件位置:xcEduService01\xc-service-api\src\main\java\com\xuecheng\api\filesystem\ FileSystemControllerApi.java

package com.xuecheng.api.filesystem;import com.xuecheng.framework.domain.filesystem.response.UploadFileResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.multipart.MultipartFile;/*** Created by Administrator.*/
@Api(value="文件管理接口",description = "文件管理接口,提供文件的增、刪、改、查")
public interface FileSystemControllerApi {//上傳文件@ApiOperation("上傳文件接口")public UploadFileResult  upload(MultipartFile multipartFile,String filetag,String businesskey,String metadata);}

3. Dao

文件位置:xcEduService01\xc-service-base-filesystem\src\main\java\com\xuecheng\filesystem\dao\ FileSystemRepository.java

package com.xuecheng.filesystem.dao;import com.xuecheng.framework.domain.filesystem.FileSystem;
import org.springframework.data.mongodb.repository.MongoRepository;public interface FileSystemRepository extends MongoRepository<FileSystem,String> {
}

4. Service

文件位置:xcEduService01\xc-service-base-filesystem\src\main\java\com\xuecheng\filesystem\service\ FileSystemService.java

package com.xuecheng.filesystem.service;import com.alibaba.fastjson.JSON;
import com.xuecheng.filesystem.dao.FileSystemRepository;
import com.xuecheng.framework.domain.filesystem.FileSystem;
import com.xuecheng.framework.domain.filesystem.response.FileSystemCode;
import com.xuecheng.framework.domain.filesystem.response.UploadFileResult;
import com.xuecheng.framework.exception.ExceptionCast;
import com.xuecheng.framework.model.response.CommonCode;
import org.apache.commons.lang3.StringUtils;
import org.csource.fastdfs.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.util.Map;/*** @author Administrator* @version 1.0**/
@Service
public class FileSystemService {@Value("${xuecheng.fastdfs.tracker_servers}")String tracker_servers;@Value("${xuecheng.fastdfs.connect_timeout_in_seconds}")int connect_timeout_in_seconds;@Value("${xuecheng.fastdfs.network_timeout_in_seconds}")int network_timeout_in_seconds;@Value("${xuecheng.fastdfs.charset}")String charset;@AutowiredFileSystemRepository fileSystemRepository;//上傳文件public UploadFileResult upload( MultipartFile multipartFile,String filetag,String businesskey,String metadata){if(multipartFile ==null){ExceptionCast.cast(FileSystemCode.FS_UPLOADFILE_FILEISNULL);}//第一步:將文件上傳到fastDFS中,得到一個文件idString fileId = fdfs_upload(multipartFile);if(StringUtils.isEmpty(fileId)){ExceptionCast.cast(FileSystemCode.FS_UPLOADFILE_SERVERFAIL);}//第二步:將文件id及其它文件信息存儲到mongodb中。FileSystem fileSystem = new FileSystem();fileSystem.setFileId(fileId);fileSystem.setFilePath(fileId);fileSystem.setFiletag(filetag);fileSystem.setBusinesskey(businesskey);fileSystem.setFileName(multipartFile.getOriginalFilename());fileSystem.setFileType(multipartFile.getContentType());if(StringUtils.isNotEmpty(metadata)){try {Map map = JSON.parseObject(metadata, Map.class);fileSystem.setMetadata(map);} catch (Exception e) {e.printStackTrace();}}fileSystemRepository.save(fileSystem);return new UploadFileResult(CommonCode.SUCCESS,fileSystem);}//上傳文件到fastDFS/**** @param multipartFile 文件* @return 文件id*/private String fdfs_upload(MultipartFile multipartFile){//初始化fastDFS的環境initFdfsConfig();//創建trackerClientTrackerClient trackerClient = new TrackerClient();try {TrackerServer trackerServer = trackerClient.getConnection();//得到storage服務器StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);//創建storageClient來上傳文件StorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);//上傳文件//得到文件字節byte[] bytes = multipartFile.getBytes();//得到文件的原始名稱String originalFilename = multipartFile.getOriginalFilename();//得到文件擴展名String ext = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);String fileId = storageClient1.upload_file1(bytes, ext, null);return fileId;} catch (Exception e) {e.printStackTrace();}return null;}//初始化fastDFS環境private void initFdfsConfig(){//初始化tracker服務地址(多個tracker中間以半角逗號分隔)try {ClientGlobal.initByTrackers(tracker_servers);ClientGlobal.setG_charset(charset);ClientGlobal.setG_network_timeout(network_timeout_in_seconds);ClientGlobal.setG_connect_timeout(connect_timeout_in_seconds);} catch (Exception e) {e.printStackTrace();//拋出異常ExceptionCast.cast(FileSystemCode.FS_INITFDFSERROR);}}
}

5. Controller

文件位置:xcEduService01\xc-service-base-filesystem\src\main\java\com\xuecheng\filesystem\controller\ FileSystemController.java

package com.xuecheng.filesystem.controller;import com.xuecheng.api.filesystem.FileSystemControllerApi;
import com.xuecheng.filesystem.service.FileSystemService;
import com.xuecheng.framework.domain.filesystem.response.UploadFileResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;/*** @author Administrator* @version 1.0**/
@RestController
@RequestMapping("/filesystem")
public class FileSystemController implements FileSystemControllerApi {@AutowiredFileSystemService fileSystemService;@Override@PostMapping("/upload")public UploadFileResult upload(MultipartFile multipartFile, String filetag, String businesskey, String metadata) {return fileSystemService.upload(multipartFile, filetag, businesskey, metadata);}
}

6. 測試

使用swagger-ui或postman進行測試。下圖是使用swagger-ui進行測試的界面:

在這里插入圖片描述

四. 前端開發

1. 需求

上傳圖片界面如下圖,點擊“加號”上傳圖片,圖片上傳成功自動顯示;點擊“刪除”將刪除圖片。

在這里插入圖片描述

2. 頁面

使用Element-UI的Upload上傳組件實現上邊的效果。
文件位置:xc-ui-pc-teach\src\module\course\page\course_manage\course_picture.vue

1). Template

<template><div><el-uploadaction="/api/filesystem/upload"list-type="picture-card":before-upload="setuploaddata":on-success="handleSuccess":file-list="fileList":limit="picmax":on-exceed="rejectupload":before-remove="handleRemove":data="uploadval"name="multipartFile"><i class="el-icon-plus"></i></el-upload></div>
</template>

el-upload參數說明:
action:必選參數,上傳的地址
list-type:文件列表的類型(text/picture/picture-card)
before-upload:上傳前執行鉤子方法 ,function(file)
on-success:上傳成功 執行的鉤子方法 ,function(response, file, fileList)
on-error:上傳失敗的鉤子方法,function(err, file, fileList)
on-remove:文件刪除的鉤子方法,function(file, fileList)
file-list:文件列表,此列表為上傳成功 的文件
limit:最大允許上傳個數
on-exceed:文件超出個數限制時的鉤子,方法為:function(files, fileList)
data:提交上傳的額外參數,需要封裝為json對象,最終提交給服務端為key/value串

2). 數據模型

<script>import * as sysConfig from '@/../config/sysConfig';import * as courseApi from '../../api/course';import utilApi from '../../../../common/utils';import * as systemApi from '../../../../base/api/system';export default {data() {return {picmax:1,//最大上傳文件的數量courseid:'',dialogImageUrl: '',dialogVisible: false,fileList:[],uploadval:{filetag:"course",businesskey:"testbusinesskey"},//上傳提交的額外的數據 ,將uploadval轉成key/value提交給服務器imgUrl:sysConfig.imgUrl}},methods: {//超出文件上傳個數提示信息rejectupload(){this.$message.error("最多上傳"+this.picmax+"個圖片");},//在上傳前設置上傳請求的數據setuploaddata(){},//刪除圖片handleRemove(file, fileList) {console.log(file)return new Promise((resolve,reject)=>{courseApi.deleteCoursePic(this.courseid).then(res=>{if(res.success){//成功resolve();}else{this.$message.error("刪除失敗");//失敗reject();}})})//上傳成功的鉤子方法handleSuccess(response, file, fileList){console.log(response)
//        alert('上傳成功')//調用課程管理的保存圖片接口,將圖片信息保存到課程管理數據庫course_pic中//從response得到新的圖片文件的地址if(response.success){let fileId = response.fileSystem.fileId;courseApi.addCoursePic(this.courseid,fileId).then(res=>{if(res.success){this.$message.success("上傳圖片成功")}else{this.$message.error(res.message)}})}},//上傳失敗執行的鉤子方法handleError(err, file, fileList){this.$message.error('上傳失敗');//清空文件隊列this.fileList = []},//promise 有三種狀態://進行中pending//執行成功 resolve//執行失敗 rejecttestPromise(i){return new Promise((resolve,reject)=>{if(i<2){//成功了resolve('成功了');}else{//失敗了reject('失敗了');}})}},mounted(){//課程idthis.courseid = this.$route.params.courseid;//查詢課程courseApi.findCoursePicList(this.courseid).then(res=>{if(res && res.pic){let imgUrl = this.imgUrl+res.pic;//將圖片地址設置到this.fileList.push({name:'pic',url:imgUrl,fileId:res.pic})}}).catch(res=>{})</script>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451874.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451874.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451874.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

13個超棒的代碼資源網站推薦

很多開發者都有過網站開發的經歷&#xff0c;大家使用CSS、HTML以及JavaScript等技術來完成這一工作。但想必大家也知道&#xff0c;網站開發是一個很耗費時間的工作。你可能需要花費大量的時間在一些網站上尋找解決問題的代碼段。這的確很耗費時間&#xff0c;但卻幾乎又是不可…

BZOJ.3052.[WC2013]糖果公園(樹上莫隊 帶修改莫隊)

題目鏈接 BZOJ 當然哪都能交(都比在BZOJ交好)&#xff0c;比如UOJ #58 //67376kb 27280ms //樹上莫隊帶修改莫隊 模板題 #include <cmath> #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> //#define gc() get…

Jquery Datatable的使用樣例(ssm+bootstrsp框架下)服務器端分頁

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 效果&#xff1a; 我這個表格數據 比較少沒有第2頁 有多例多頁的效果&#xff08;帶滾動條和翻頁&#xff09;&#xff1a; 1. jsp頁面…

Hadoop集群(四) Hadoop升級

Hadoop前面安裝的集群是2.6版本&#xff0c;現在升級到2.7版本。 注意&#xff0c;這個集群上有運行Hbase&#xff0c;所以&#xff0c;升級前后&#xff0c;需要啟停Hbase。 更多安裝步驟&#xff0c;請參考&#xff1a; Hadoop集群(一) Zookeeper搭建 Hadoop集群(二) HDFS搭建…

學成在線--24.課程圖片管理(保存課程圖片)

文章目錄一. 需求分析二. 服務端開發1. 模型類2. API3. Dao4. Service5. Controller三. 前端開發1. API2. 頁面1). 添加上傳成功的鉤子 :on-success"handleSuccess"2). 在鉤子方法 中保存課程圖片信息一. 需求分析 圖片上傳到文件系統后&#xff0c;其它子系統如果想…

從任意網頁上摘取酷炫Jquery效果為自己使用的方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 用的chrome 瀏覽器 2. 隨意百度一個漂亮的jquery效果 比如我找到一個可以旋轉的多面體效果 3. 再F12選 Resources到如下界面&…

shell基礎05 處理用戶輸入

1. 命令行參數------類似javac 參數1 參數2 類似Java中編譯的javac parm1....。在shell中&#xff0c;參數與參數之間用空格隔開。采用位置參數來識別對應的參數值&#xff1a;$0是程序名&#xff0c;$1是第一個參數&#xff0c;以此類推&#xff0c;知道第9個參數$9。對于大…

OpenCV 2.4.0 正式版發布,開源計算機視覺庫

OpenCV 于近日發布了 2.4.0 正式版。 OpenCV是一個基于BSD許可證授權發行的跨平臺開源計算機視覺庫&#xff0c;可以運行在Linux、Windows和Mac OS操作系統上。作為一款簡潔而且高效的視覺庫&#xff0c;OpenCV由一系列 C 函數和少量 C 類構成&#xff0c;同時提供了Python、Ru…

最小編輯代價-golang

題目&#xff1a; 給定兩個字符串str1和str2&#xff0c;在給定三個整數ic,dc和rc,分別代表插入、刪除和替換一個 字符&#xff0c;返回將str1編輯成str2的最小代價。 解題方法&#xff1a; 動態規劃。首先生成大小為(M1)X(N1)的矩陣dp。 假設str1"avb12cd3", str2&q…

You can't specify target table 'TS_AUTH_ADMIN' for update in FROM clause記錄

&#xff11;. 報錯&#xff1a;You cant specify target table TS_AUTH_ADMIN for update in FROM clause&#xff0c; 百度查到說是&#xff0c;不能在同一語句中先select出同一表中的某些值,再update這個表 。 我原本的sql是&#xff1a;&#xff08;刪除角色的時候&#…

study of javaserver faces lifecycle

JavaServer Faces應用程序的生命周期在客戶端為頁面發出HTTP請求時開始&#xff0c;并在服務器響應該頁面并轉換為HTML時結束。 通常將JSF的生命周期分為兩個階段&#xff1a; #執行階段 #渲染階段 1.執行階段 JavaServer Faces應用程序生命周期執行階段包含以下子階段&#xf…

從開源軟件開發中體會到的心得

Mitchell Hashimoto 是一名開源軟件工程師。由他托管到 GitHub 上的 開源項目 Vagrant&#xff0c;是一個用于創建和部署虛擬化開發環境的工具。近日&#xff0c;Mitchell撰文講述了在開發 Vagrant 的過程中學到的有關開源軟件開發的一些心得。 以下為原文文章&#xff1a; 把 …

學成在線--25.課程圖片管理(圖片查詢)

文章目錄一. 需求分析二. API三. 服務端開發1. Dao2. Service3. Controller四. 前端開發1. API方法2. 頁面一. 需求分析 課程圖片上傳成功&#xff0c;再次進入課程上傳頁面應該顯示出來已上傳的圖片。 二. API 在課程管理服務定義查詢方法 文件位置&#xff1a;xcEduServic…

redux源碼解讀

背景 因為就得去實習了。所以打算開始補補坑。比如自己閱讀源碼的計劃。所以今天來聊聊redux的源碼。后續會有redux-thunk和react-redux的源碼閱讀。搞定這些的話&#xff0c;就開始閱讀一個node的庫的源碼了&#xff0c;比如eventproxy和anywhere。 開始 總覽, redux的文件結構…

sql語句update中多個case/when的寫法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 又如&#xff1a; update xxxx_xxxx set xxx_typeCASE WHEN xxx_type 0 THENYXLX-0WHEN xxx_type 1 THENYXLX-1WHEN xxx_type 2 THE…

Redis-ha(sentinel)搭建

服務器描述&#xff1a;本次搭建是用來測試&#xff0c;所以是在一臺服務器上搭建三個redis服務&#xff08;一主兩從&#xff09; 服務角色 端口 Redis.conf名稱 sentinel配置文件名稱 sentinel端口 redis日志路徑 sentinel路勁 主(master) 6379 redis.conf sentine…

學成在線--26.課程圖片管理(圖片刪除)

文章目錄一. 需求分析二. API三. 服務端開發1. Dao2. Service3. Controller四. 前端開發1. API方法2. 頁面1.before-remove鉤子方法2.handleRemove鉤子方法一. 需求分析 課程圖片上傳成功后&#xff0c;可以重新上傳&#xff0c;方法是先刪除現有圖片再上傳新圖片&#xff1b;…

警惕開源代碼庫中的安全隱患

最近的一項研究發現&#xff0c; 在調查的31個流行庫&#xff08;框架&#xff09;的1261個版本中&#xff0c;超過三分之一存在已知的安全漏洞&#xff0c;大約四分之一的下載文件已經被污染。 該項研究由Aspect Security和Sonatype發起。Aspect Security是一家評估軟件安全漏…