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