首页 > 其他分享 >自媒体后台搭建 —— 素材图片上传

自媒体后台搭建 —— 素材图片上传

时间:2023-06-28 16:37:45浏览次数:34  
标签:heima com springframework 素材 org 后台 import 上传 public

一、自媒体后台搭建

1、搭建自媒体平台网关:leadnew-wemedia-gateway

2、搭建自媒体微服务:leadnews-wemedia-service

二、自媒体素材管理

图片上传

1、如何获得用户信息

  在自媒体网关过滤器filter中解析token,获取用户id,存入headers

package com.heima.wemedia.gateway.filter;


import com.heima.wemedia.gateway.util.AppJwtUtil;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
@Slf4j
public class AuthorizeFilter implements Ordered, GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1.获取request和response对象
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();

        //2.判断是否是登录
        if(request.getURI().getPath().contains("/login")){
            //放行
            return chain.filter(exchange);
        }

        //3.获取token
        String token = request.getHeaders().getFirst("token");

        //4.判断token是否存在
        if(StringUtils.isBlank(token)){
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete();
        }

        //5.判断token是否有效
        try {
            Claims claimsBody = AppJwtUtil.getClaimsBody(token);
            //是否是过期
            int result = AppJwtUtil.verifyToken(claimsBody);
            if(result == 1 || result  == 2){
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                return response.setComplete();
            }
            //获取用户信息
            Object userId = claimsBody.get("id");
            //存入header
            ServerHttpRequest serverHttpRequest = request.mutate().headers(httpHeaders -> {
                httpHeaders.add("userId", userId + "");
            }).build();
            //重置请求
            exchange.mutate().request(serverHttpRequest);

        } catch (Exception e) {
            e.printStackTrace();
        }

        //6.放行
        return chain.filter(exchange);
    }

    /**
     * 优先级设置  值越小  优先级越高
     * @return
     */
    @Override
    public int getOrder() {
        return 0;
    }
}

  在自媒体微服务中创建拦截器,从header中获取用户存入当前线程ThreadLocal。

  ThreadLocal:

package com.heima.utils.common.thread;

import com.heima.model.wemedia.pojos.WmUser;

public class WmThreadLocalUtil {
    public final  static ThreadLocal<WmUser> WM_USER_THREAD_LOCAL = new ThreadLocal<>();
    
    //存入线程
    public void setUser(WmUser wmUser){
        WM_USER_THREAD_LOCAL.set(wmUser);
    }
    
    //从线程中获取
    public static WmUser getUser(){
        return WM_USER_THREAD_LOCAL.get();
    }
    
    //清理
    public static void clear(){
        WM_USER_THREAD_LOCAL.remove();
    }
}

拦截器:

package com.heima.wemedia.interceptor;

import com.heima.model.wemedia.pojos.WmUser;
import com.heima.utils.common.thread.WmThreadLocalUtil;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class WmTokenInterceptor implements HandlerInterceptor {
    /**
     * 得到header中的用户信息并且存入当前线程
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String userId = request.getHeader("userId");
        if(userId != null){
            //存入当前线程
            WmUser wmUser = new WmUser();
            wmUser.setId(Integer.valueOf(userId));
            WmThreadLocalUtil.setUser(wmUser);
        }
        return true;
    }

    /**
     * 清理线程中的数据
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        WmThreadLocalUtil.clear();
    }
}
package com.heima.wemedia.config;

import com.heima.wemedia.interceptor.WmTokenInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new WmTokenInterceptor()).addPathPatterns("/**");
    }
}
package com.heima.wemedia.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.file.service.FileStorageService;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.wemedia.pojos.WmMaterial;
import com.heima.utils.common.thread.WmThreadLocalUtil;
import com.heima.wemedia.mapper.WmMaterialMapper;
import com.heima.wemedia.service.WmMaterialService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Date;
import java.util.UUID;


@Slf4j
@Service
@Transactional
public class WmMaterialServiceImpl extends ServiceImpl<WmMaterialMapper, WmMaterial> implements WmMaterialService {

    @Autowired
    private FileStorageService fileStorageService;
    /**
     * 素材图片上传
     * @param multipartFile
     * @return
     */
    @Override
    public ResponseResult uploadPicture(MultipartFile multipartFile) {
        //1、检查参数
        if(multipartFile == null || multipartFile.getSize() == 0){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        //2、上传图片到minIO中
        String fileName = UUID.randomUUID().toString().replace("-", "");
        //aa.jpg
        String originalFilename = multipartFile.getOriginalFilename();
        String postfix = originalFilename.substring(originalFilename.lastIndexOf("."));
        String fileId = null;
        try {
            fileId = fileStorageService.uploadImgFile("", fileName + postfix, multipartFile.getInputStream());
            log.info("上传图片到minIO中, fileId:" + fileId);
        } catch (IOException e) {
            e.printStackTrace();
            log.error("WmMaterialServiceImpl-上传文件失败");
        }
        //3、保存到数据库中
        WmMaterial wmMaterial = new WmMaterial();
        wmMaterial.setUserId(WmThreadLocalUtil.getUser().getId());
        wmMaterial.setUrl(fileId);
        wmMaterial.setIsCollection((short)0);
        wmMaterial.setType((short)0);
        wmMaterial.setCreatedTime(new Date());
        save(wmMaterial);
        //4、返回结果
        return ResponseResult.okResult(wmMaterial);
    }
}

 

标签:heima,com,springframework,素材,org,后台,import,上传,public
From: https://www.cnblogs.com/fxzm/p/17511763.html

相关文章

  • csharp http大文件断点续传上传
    ​IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头。 一. 两个必要响应头Accept-Ranges、ETag        客户端每次提交下载请求时,服务端都要添加这两个响应头,以保证客户端和服务端将此下载识别为可以断点续传......
  • 上传图片分辨率,像素大小限制
    原文//上传图片handleBeforeUploadCompanyLogo(file){//企业logobefoevarthat=thisconst_URL=window.URL||window.webkitURLconstisSize=newPromise((res,rej)=>{constimage=newImage()......
  • asp.net http大文件断点续传上传
    ​ 需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。 第一步:前端修改由于项目使用的是BJUI前端框架,并没有使用框架本身的文件上传控件,而使用的基于jQuery的Uploadify......
  • VUE http大文件断点续传上传
    ​ 对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传,从上传的效率来看,利用多线程并发上传能够达到最大效率。 本文是基于springboot+vue实现的文件上传,本文主要介绍服务端实现文件......
  • Gitee通过本地git上传大于10M的文件教程
    Gitee通过网页端默认上传的文件需要小于10M,如上传10M-100M的文件需要通过本地git上传,此时需要使用git指令操作,步骤如下。首先创建一个文件夹,打开后右键使用gitbash功能分别进行简要步骤说明如下1-8,详细可见下图操作说明。1、gitinit初始化;2、gitremote绑定gitee仓库3、git......
  • HTML5中如何上传Resize后的图片
    参考资料:不依赖form标签,而是自己定义FormData上传数据,文件被编码为一个Blob或File对象:https://developer.mozilla.org/en-US/docs/Web/Guide/Using_FormData_Objects如何用jquery上传FormData:http://stackoverflow.com/questions/9622901/how-to-upload-a-file-using-jquery-ajax-a......
  • 2023-06-27 上传微信小程序报错:{"errcode":80082,"errmsg":"get plugin(id: wxxxxxxxx
    首先80082原因是你使用的一个id为wxxxxxxxxxxxxx的插件没有授权,所以就禁止你上传了,解决方案也很简单,只需在微信小程序后台==》设置==》第三方设置==》插件管理里面重新添加该插件即可。但是。如果这个id为wxxxxxxxxxxxxx的插件你搜索不到,嘿嘿,那就蛋疼了。你需要在代码里找出这个i......
  • elementUI中upload自定义上传行为 http-request属性
    需求是上传一个xlsx后台处理完再返回xlsx流upload请求需要添加responseType:'blob'属性所有要扩展一下若依项目扩展elementUI中upload自定义上传行为http-request属性<el-uploadref="upload1":limit="1"accept=".xlsx,.xls":headers="......
  • 对文件流MD5后,该文件流上传到阿里云后文件为空
    目录背景存在问题的代码出现的问题:解决方案背景对于前端上传的文件,后端对文件进行MD5以获取文件的唯一标识(极极小可能冲撞),然后查询文件表是否上传过,如果存在则不用再上传oss,从而节省存储空间存在问题的代码@SneakyThrowspublicStringuploadFile(MultipartFi......
  • 基于前端Vue后端.NetCore Web后台管理系统通用开本框架采用前后端分离技术
    基于前端Vue后端.NetCoreWeb后台管理系统通用开本框架采用前后端分离技术,前端使用vue2.6.0,后端使用.netcore3.1,支持跨平台、多租户、支持MySQLSQLServerOracle多数据库,模块化设计,高性能,高颜值,不管是个人学习还是企业做项目都非常适合 原创文章,转载请说明出处,资料来源:http://im......