将bytearrayinputstream转换为文件而不保存到磁盘

lf3rwulv  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(964)

这个问题涉及使用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文件对象而不将任何内容保存到磁盘上?

dojqjjoe

dojqjjoe1#

作为替代方案,您可以让用户直接将文件上载到stripe,这样您就不必担心了:https://jsfiddle.net/thorstripe/bdm3j2rn/
显然我需要包含代码,因为有一个jsfiddle链接:

console.log("Go read the jsfiddle kthx");
tp5buhyn

tp5buhyn2#

不;一 java.io.File 是一个文件,因此得名。没有像虚拟文件这样的东西可以像 File 对象- java.io.File 是一个非常薄的 Package 器,它只有一个字段,这就是路径,仅此而已。所有的方法,比如 new FileInputStream(...) 从那上面读出路径 File 反对和做所有的工作本身,因此使它不可能。设计良好的javaapi不使用文件;例如,他们使用, InputStream . 如果条带api只允许 File ,那么它就是设计糟糕的api。解决方法是向回购协议发送一个pull请求,并对其进行修复。
想必,作者搞砸了;这种变体需要 FileInputStream 是个错误,应该是 InputStream 相反。我将记录在案,为什么不:一个参数类型为 FileInputStream 它坏了。不是因为“测试可以捕获它”,而是因为一个将两个数字相加的方法叫做“subtract”。
热释光;医生:不可能。

相关问题