springboot流文件上传下载

这里写自定义目录标题

    • byte字节数组

Spring Boot是Java生态中的一个微框架,提供了快速Web应用程序开发的工具,包括文件上传和下载功能。下面是一个简单的演示例子:

文件上传
要上传文件,我们需要使用Spring框架的MultipartFile实例。

@Controller
public class FileUploadController {
	@PostMapping("/upload")
	public @ResponseBody String handleFileUpload(@RequestParam("file") MultipartFile file) {
		String fileName = StringUtils.cleanPath(file.getOriginalFilename());
		try {
			if (fileName.contains("..")) {
				throw new RuntimeException("Invalid file name");
			}
			Path targetPath = Paths.get("./uploads/" + fileName);
			Files.copy(file.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);
			return "File uploaded successfully";
		} catch (IOException e) {
			throw new RuntimeException("Failed to store file " + fileName, e);
		}
	}
}

在这个例子中,我们使用@RequestParam注释指定单个文件的名称,在该方法中使用getInputStream()方法获取文件的输入流,并将它从内存中复制到指定路径的文件中。

文件下载
要下载文件,我们可以使用Spring框架的一个特殊的注解:@ResponseBody来指定文件的输出流,并将文件数据写入响应中。

@Controller
public class FileDownloadController {
	@GetMapping("/download/{fileName:.+}")
	public void downloadFile(@PathVariable String fileName, HttpServletResponse response) throws IOException {
		Path filePath = Paths.get("./uploads/" + fileName);
		Resource resource = new UrlResource(filePath.toUri());
		if(resource.exists()) {
		response.setContentType("application/octet-stream");
		response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="" + resource.getFilename() + """);
		InputStream inputStream = resource.getInputStream();
		IOUtils.copy(inputStream, response.getOutputStream());
		inputStream.close();
		}
	}
}

在这个例子中,我们使用@GetMapping注释指定要下载的文件的名称,并使用@PathVariable注释指定它是一个路径变量。然后,我们使用spring框架提供的UrlResource实例来获取文件资源,指定文件类型和名称。最后,我们使用IOUtils.copy()方法将文件数据从输入流复制到输出流中,并关闭输入流。

byte字节数组

如果你想将文件转换为字节数组,并将其作为JSON响应发送到客户端

将文件转换为字节数组

Path path = Paths.get("path/to/file");
byte[] fileBytes = Files.readAllBytes(path);

创建包含字节数组的Map对象

Map<String, byte[]> fileMap = new HashMap<>();
fileMap.put("data", fileBytes);

将Map对象转换为JSON格式

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(fileMap);

发送JSON响应给客户端

@RestController
public class FileController {
	@GetMapping("/file")
	public String getFile() throws IOException {
	    Path path = Paths.get("path/to/file");
	    byte[] fileBytes = Files.readAllBytes(path);
	    Map<String, byte[]> fileMap = new HashMap<>();
	    fileMap.put("data", fileBytes);
	    ObjectMapper mapper = new ObjectMapper();
	    String json = mapper.writeValueAsString(fileMap);
	    return json;
	}
}

在这个例子中,我们使用@RestController注释指示该控制器将返回JSON格式的响应。在getFile()方法中,我们将文件读取到一个字节数组中,然后将这个字节数组添加到一个包含键“data”的Map对象中。接下来,我们使用Jackson的ObjectMapper将Map对象转换为JSON字符串,该字符串将被作为响应发送给客户端。

注意:这种方法可能不适用于大文件,因为将大文件读取到内存中可能会导致OutOfMemoryError。在这种情况下,考虑使用Spring MVC的文件下载。

注意:byte[] 对应前端arraybuffer 要通过类型数组对象或 DataView 对象来操作

// 来自 ArrayBuffer
var buffer = new ArrayBuffer(8);
var z = new Uint8Array(buffer, 1, 4);
z; // Uint8Array(4) [0, 0, 0, 0]

Uint8Array转文件下载才能正常读取

你可能感兴趣的:(springboot+vue3,spring,boot,java,spring)