如何临时创建一个没有任何文件位置的文本文件,并在 spring 启动时作为响应在 运行 时发送?
How to temporarily create a text file without any file location and send as a response in spring boot at run time?
需要根据可用数据创建一个txt文件,然后需要将文件作为rest response发送。
该应用程序部署在容器中。我不想将它存储在容器上的任何位置或 spring 启动资源中的任何位置。有什么方法可以在运行时缓冲区中创建文件而不提供任何文件位置,然后在 rest 响应中发送它?
应用程序是生产应用程序,所以我需要一个安全的解决方案
文件就是文件。您使用了错误的词 - 在 java 中,数据流的概念,至少对于这种工作,被称为 InputStream
或 OutputStream
。
无论你有什么方法需要 File
?那是路的尽头。一个文件就是一个文件。你不能伪造它。但是,与开发人员交谈,或检查替代方法,因为绝对没有理由在 java 中进行数据处理的任何东西都需要 File
。它应该需要一个 InputStream
或者可能需要一个 Reader
。或者甚至有一种方法可以为您提供 OutputStream
或 Writer
。所有这些都很好——它们是抽象的,让你可以从文件、网络连接或整块布料向它发送数据,这就是你想要的。
一旦你拥有其中之一,它就变得微不足道了。例如:
String text = "The Text you wanted to store in a fake file";
byte[] data = text.getBytes(StandardCharsets.UTF_8);
ByteArrayInputStream in = new ByteArrayInputStream(data);
whateverSystemYouNeedToSendThisTo.send(in);
或者例如:
String text = "The Text you wanted to store in a fake file";
byte[] data = text.getBytes(StandardCharsets.UTF_8);
try (var out = whateverSystemYouNeedToSendThisTo.getOUtputStream()) {
out.write(data);
}
看看下面的函数:
进口
import com.google.common.io.Files;
import org.springframework.http.ContentDisposition;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import java.io.*;
import java.nio.file.Paths;
函数:
@GetMapping(value = "/getFile", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
private ResponseEntity<byte[]> getFile() throws IOException {
File tempDir = Files.createTempDir();
File file = Paths.get(tempDir.getAbsolutePath(), "fileName.txt").toFile();
String data = "Some data"; //
try (FileWriter fileWriter = new FileWriter(file)) {
fileWriter.append(data).flush();
} catch (Exception ex) {
ex.printStackTrace();
}
byte[] zippedData = toByteArray(new FileInputStream(file));
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentDisposition(ContentDisposition.builder("attachment").filename("file.txt").build());
httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
httpHeaders.setContentLength(zippedData.length);
return ResponseEntity.ok().headers(httpHeaders).body(zippedData);
}
public static byte[] toByteArray(InputStream in) throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] buffer = new byte[in.available()];
int len;
// read bytes from the input stream and store them in buffer
while ((len = in.read(buffer)) != -1) {
// write bytes from the buffer into output stream
os.write(buffer, 0, len);
}
return os.toByteArray();
}
简而言之,您希望将数据存储在内存中。这个的基本构建块是字节数组 - byte[]
。
在 JDK 中有两个 类 连接 IO 世界与字节数组 - ByteArrayInputStream
和 ByteArrayOutputStream
.
休息和处理文件一样。
需要根据可用数据创建一个txt文件,然后需要将文件作为rest response发送。 该应用程序部署在容器中。我不想将它存储在容器上的任何位置或 spring 启动资源中的任何位置。有什么方法可以在运行时缓冲区中创建文件而不提供任何文件位置,然后在 rest 响应中发送它? 应用程序是生产应用程序,所以我需要一个安全的解决方案
文件就是文件。您使用了错误的词 - 在 java 中,数据流的概念,至少对于这种工作,被称为 InputStream
或 OutputStream
。
无论你有什么方法需要 File
?那是路的尽头。一个文件就是一个文件。你不能伪造它。但是,与开发人员交谈,或检查替代方法,因为绝对没有理由在 java 中进行数据处理的任何东西都需要 File
。它应该需要一个 InputStream
或者可能需要一个 Reader
。或者甚至有一种方法可以为您提供 OutputStream
或 Writer
。所有这些都很好——它们是抽象的,让你可以从文件、网络连接或整块布料向它发送数据,这就是你想要的。
一旦你拥有其中之一,它就变得微不足道了。例如:
String text = "The Text you wanted to store in a fake file";
byte[] data = text.getBytes(StandardCharsets.UTF_8);
ByteArrayInputStream in = new ByteArrayInputStream(data);
whateverSystemYouNeedToSendThisTo.send(in);
或者例如:
String text = "The Text you wanted to store in a fake file";
byte[] data = text.getBytes(StandardCharsets.UTF_8);
try (var out = whateverSystemYouNeedToSendThisTo.getOUtputStream()) {
out.write(data);
}
看看下面的函数:
进口
import com.google.common.io.Files;
import org.springframework.http.ContentDisposition;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import java.io.*;
import java.nio.file.Paths;
函数:
@GetMapping(value = "/getFile", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
private ResponseEntity<byte[]> getFile() throws IOException {
File tempDir = Files.createTempDir();
File file = Paths.get(tempDir.getAbsolutePath(), "fileName.txt").toFile();
String data = "Some data"; //
try (FileWriter fileWriter = new FileWriter(file)) {
fileWriter.append(data).flush();
} catch (Exception ex) {
ex.printStackTrace();
}
byte[] zippedData = toByteArray(new FileInputStream(file));
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentDisposition(ContentDisposition.builder("attachment").filename("file.txt").build());
httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
httpHeaders.setContentLength(zippedData.length);
return ResponseEntity.ok().headers(httpHeaders).body(zippedData);
}
public static byte[] toByteArray(InputStream in) throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream();
byte[] buffer = new byte[in.available()];
int len;
// read bytes from the input stream and store them in buffer
while ((len = in.read(buffer)) != -1) {
// write bytes from the buffer into output stream
os.write(buffer, 0, len);
}
return os.toByteArray();
}
简而言之,您希望将数据存储在内存中。这个的基本构建块是字节数组 - byte[]
。
在 JDK 中有两个 类 连接 IO 世界与字节数组 - ByteArrayInputStream
和 ByteArrayOutputStream
.
休息和处理文件一样。