这个问题涉及使用java/groovy/grails处理文件。我对这些技术还不熟悉,所以请容忍我。
在从客户端收到用户提交的post请求后,我将一个文件上载到stripe。如果可以避免的话,我不想把它保存到磁盘上。
我接收文件并解析为一个字节数组。
List<MultipartFile> files = ((MultipartHttpServletRequest) request).getMultiFileMap().collect {
it.value
}.flatten()
try {
if (files.size > 0) {
// parse file and get byte array input stream
MultipartFile file = files.first()
String fileName = file.originalFilename
byte[] bytes = file.inputStream.getBytes()
callStripeFileService(bytes)
}
这个字节数组被传递给一个服务,该服务调用stripe,如它们的文档所示。
callStripeFileService(byte[] bytes) {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes)
String tempFilePath =
"src/main/resources/tmp/${fileName}"
IOUtils.copy(bais, new FileOutputStream(tempFilePath))
FileCreateParams params = FileCreateParams.builder()
.setFile(new java.io.File(tempFilePath))
.setPurpose(FileCreateParams.Purpose.RECEIPT)
.build()
File upload = File.create(params)
}
这是工作得很好,但我不喜欢写的文件到磁盘上只有删除它最终。我还怀疑写入磁盘肯定会影响性能。
我很想把一条溪流传给stripe,但是 .setFile()
方法只接受文件或fileinputstream。
有没有办法创建一个有效的java文件对象而不将任何内容保存到磁盘上?
2条答案
按热度按时间dojqjjoe1#
作为替代方案,您可以让用户直接将文件上载到stripe,这样您就不必担心了:https://jsfiddle.net/thorstripe/bdm3j2rn/
显然我需要包含代码,因为有一个jsfiddle链接:
tp5buhyn2#
不;一
java.io.File
是一个文件,因此得名。没有像虚拟文件这样的东西可以像File
对象-java.io.File
是一个非常薄的 Package 器,它只有一个字段,这就是路径,仅此而已。所有的方法,比如new FileInputStream(...)
从那上面读出路径File
反对和做所有的工作本身,因此使它不可能。设计良好的javaapi不使用文件;例如,他们使用,InputStream
. 如果条带api只允许File
,那么它就是设计糟糕的api。解决方法是向回购协议发送一个pull请求,并对其进行修复。想必,作者搞砸了;这种变体需要
FileInputStream
是个错误,应该是InputStream
相反。我将记录在案,为什么不:一个参数类型为FileInputStream
它坏了。不是因为“测试可以捕获它”,而是因为一个将两个数字相加的方法叫做“subtract”。热释光;医生:不可能。