Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用字节数组将图像、xls文件插入blob时丢失字节并损坏数据_Java_Spring_Image_Blob_Xls - Fatal编程技术网

Java 使用字节数组将图像、xls文件插入blob时丢失字节并损坏数据

Java 使用字节数组将图像、xls文件插入blob时丢失字节并损坏数据,java,spring,image,blob,xls,Java,Spring,Image,Blob,Xls,我想创建一个通用的上传代码,它可以将所有数据,无论是文本、图像、视频文件等插入blob字段,并从中检索数据。我有 假设将文件转换为字节,然后上载,并使用类似的方法下载它会起作用。 让我吃惊的是,尽管我能够使用字节方法成功下载任何格式的文件, 通过将文件转换为字节上传文件仅适用于pdf和文本相关文档。在上传图像文件,甚至xls文件时,我 观察到blob字段的字节大小与原始文件的字节大小不匹配。下载后发现这些文件不可读 我遇到了一个程序,可以帮助我实现我想要的。但这意味着 在我当前的代码中进行了大量

我想创建一个通用的上传代码,它可以将所有数据,无论是文本、图像、视频文件等插入blob字段,并从中检索数据。我有 假设将文件转换为字节,然后上载,并使用类似的方法下载它会起作用。 让我吃惊的是,尽管我能够使用字节方法成功下载任何格式的文件, 通过将文件转换为字节上传文件仅适用于pdf和文本相关文档。在上传图像文件,甚至xls文件时,我 观察到blob字段的字节大小与原始文件的字节大小不匹配。下载后发现这些文件不可读

我遇到了一个程序,可以帮助我实现我想要的。但这意味着 在我当前的代码中进行了大量的重写。我希望在我当前的代码中有一条出路

截至目前,我的“插入到blob”代码为:

表结构:

desc project_storage
Name       Null Type          
---------- ---- ------------- 
PROJECT_ID      NUMBER(38)    
FILE_NAME       VARCHAR2(200) 
DOCUMENTS       BLOB          
ALIAS           VARCHAR2(50)  
FILE_TYPE       VARCHAR2(200)
代码:

@RequestMapping(value="/insertProject.htm", method = { RequestMethod.POST}, headers="Accept=*/*")
    public String insert(@RequestParam Map<String,Object> parameters,@RequestParam CommonsMultipartFile file,Model model,HttpServletRequest req){
        try
        {
            log.info("Datasource || attempt to insert into project storage -Start()");
            if(file!=null)
            {
                String file_type=file.getContentType();
                String file_name=file.getOriginalFlename();
                String file_storage=file.getStorageDescription();
                long file_size=file.getSize();
                System.out.println("File type is : "+file_type);
                System.out.println("File name is :"+file_name);
                System.out.println("File size is"+file_size);
                System.out.println("Storage Description :"+file_storage);
            ByteArrayOutputStream barr = new ByteArrayOutputStream();
                ObjectOutputStream objOstream = new ObjectOutputStream(barr);
                objOstream.writeObject(file);
                objOstream.flush();
                objOstream.close();
                byte[] bArray = barr.toByteArray(); 

            //  byte [] bArray=file.getBytes();
            //  InputStream inputStream = new ByteArrayInputStream(bArray);
                //inputStream.read();
                Object objArray[]=new Object[]{file_name,bArray,parameters.get("alias"),file_type};   //bArray is our target.
           int result=dbUtil.saveData("Insert into Project_Storage(Project_Id,File_Name,Documents,Alias,File_Type) values(to_number(?),?,?,?,?)", objArray);
            model.addAttribute(result);

            }
        }   
        catch(Exception e){
            System.out.println("Exception while inserting the documents"+e.toString());
            e.printStackTrace();
        }

        log.info("Datasource || attempt to insert new project -end()");
        return "admin/Result";
        }
下载的文件大小为6.7KB,包含以下数据:

这表明这是一个数据损坏的问题。我之前假设只有部分数据输入正在发生。 编辑:-正在通过表单读取文件

<span class="btn btn-default btn-file" id="btn_upload">
    Browse <input type="file" name="file"></span>

您正在存储一个java对象:文件。检索似乎是错误的,因为您在Excel文件中看到了一些序列化对象

由于上传的数据文件是临时性的,上传的文件应该得到处理和删除,我不认为该文件将包含全部内容,但不确定!,最好显式存储内容的字节,与元数据(如文件大小和类型)分开。这将允许立即将文件内容流式传输给用户。上传也是如此:提供用于存储blob的InputStream将减少服务器负载,而不是ByteArrayOutputStream

将元数据分开还可以提供一个很好的目录概览。

我看到了问题所在。 这就是它的工作原理。 原始文件内容=6144字节 它包含excel/pdf/jpeg的正确标题

让我们称之为A。 A通常由两部分组成。[Ah+Ab]=[A] 啊是标题,它告诉excel这是一个excel文档,它告诉pdf阅读器这是一个pdf文档。通常只有几个字节。也许3或4,也许稍微多一点

Ab是身体

SizeA=6144字节 SizeAh+Ab=6144字节

嗯。使用6114字节完成

接下来是存储为blob的6.7kb。 这包含了更多的数据

SizeBlob=SizeCommonsMultipartFile文件=6.7kb

它包含[文件大小、mime类型、Ah+Ab、其他数据]

所以你有两个选择

备选方案a:

更改存储代码,不更改检索代码

使用字节[]bArray=barr.toByteArray

存储Ah+Ab

备选案文b: 更改检索代码,不更改存储代码。
当您从数据库获取数据时,将其转换为CommonMultipartFile文件,然后从该文件中使用file.getBytes并将字节的内容写入servlet输出流。

我不熟悉java,但我曾经遇到过blob问题。检查这些答案是否对您有帮助:@Clyff,我认为这不是尺寸/长度限制。。虽然我也是编程新手。然而,今天从您那里学到了一件新事情:-为什么要保存在Blob中,或者甚至在DB中,您可以在DB中使用bytea,并在这里保存为字节数组。优点是加工量少。您可以通过在bytea变量上指定atBasic注释并延迟加载来延迟加载该变量,因此不会总是提取文档。如果文件不能包含整个内容,则无法了解相当大的pdf文件是如何无缝插入的。将尝试实现您的建议以提高性能。对不起,我认为您应该显示阅读代码。我仍然希望这是一些琐碎的事情,比如块读取出错或者诸如此类。也许我错过了我应该发布的东西,文件正在通过表单读取。浏览与此有关吗?同样,文件大小与预期上载文件的大小相同,正如我们在“控制台输出”中所看到的,因此我假设这部分功能正常。这就是为什么省略了相同的内容。我会马上删除我的答案,这样你会有更多的读者。嗨,我似乎能够将现在获得的文件完美地移动到另一个文件夹中,如下所示:“试试看。”{File file2=new FileC:\\trial\\\+File\u name;file2.getParentFile.mkdir;file2.createNewFile;File.transferTofile2;}catchSecurityException e{System.out.printlnFile由于安全异常而无法创建;e.printStackTrace;}“用于下载该文件的代码在我的另一个问题中:到目前为止,它工作得完美无缺,因此不打算更改此代码。因此,这给我留下了选项a,我认为我现在正在实现它。” 现在,感谢您的见解:-
<span class="btn btn-default btn-file" id="btn_upload">
    Browse <input type="file" name="file"></span>