Redis KitKat Obscene Save File

Fallhintergrund: Ich möchte keine Datei auf dem Server generieren und auf diese Datei kann nur zeitlich begrenzt zugegriffen werden. Daher gelten für mich die folgenden Anforderungen 

Der Kern dieser Demo besteht in der Verwendung der Base64-Kodierung und -Dekodierung.

Gleichzeitig speichert Redis den Bytecode direkt und muss die Serialisierungsmethode der Redis-Vorlage konfigurieren.

Konfigurieren Sie application.yml, um das Hochladen von 100 Millionen Anhängen zu ermöglichen

Frühling:
  Servlet:
    mehrteilig:
      Maximale Dateigröße: 100 MB
      Maximale Anforderungsgröße: 100 MB

 Code der Steuerebene

package com.example.demo11.Controller;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Base64;
import java.util.Date;


@RestController
@RequestMapping("/file")
public class DownExcel {




    @Autowired
    private RedisTemplate redisTemplate;


    @PostMapping("/uploadFile")
    public Long uploadFile(MultipartFile file) throws IOException {

        String value=Base64.getEncoder().encodeToString(file.getBytes());


        long key = new Date().getTime();
        ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set("File:" + key, value);
        redisTemplate.expireAt("File:" + key, new Date(new Date().getTime() + 4000000));
        return key;
    }

    @GetMapping("/File/{key}")
    public void file(@PathVariable("key") String key, HttpServletRequest request, HttpServletResponse response) {
        ValueOperations valueOperations = redisTemplate.opsForValue();
        Object o = valueOperations.get("File:" + key);
        if (o != null) {
            response.setContentType("application/x-download");
            ServletOutputStream outputStream = null;
            try {
                outputStream = response.getOutputStream();

                byte[] decode = Base64.getDecoder().decode(o.toString());

                outputStream.write(decode);

            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                try {
                    if (outputStream != null) {
                        outputStream.close();
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }

        }
    }

}

Statische Konfigurationsklasse ()

package com.example.demo11.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        // 准备RedisTemplate对象
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        // 设置连接工厂
        redisTemplate.setConnectionFactory(connectionFactory);
        // 创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // 设置key的序列化
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        // 设置value的序列化
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        // 返回
        return redisTemplate;
    }

}

Daten hochladen

Linux verwendet den folgenden Befehl

curl -X POST -F 'file=@/home/rock/Desktop/untitled.png' http://10.147.17.25:8080/file/upload

 Windows verwendet die folgenden Befehle und Parameter

curl -X POST -H "Content-Type: multipart/form-data" -F "file=@D:/scrcpy/adb.exe" http://10.147.17.25:8080/file/upload

Oder nutzen Sie zum Testen das Apifox-Tool 

Guess you like

Origin blog.csdn.net/u013833472/article/details/129554902