0

我目前无法使用 .mp3 将一个非常小的文件 (.mp3) 上传到 MySQL 数据库DataHandler。我正在本地尝试代码,然后将其转换为 Web 服务。以下“粗略”代码尝试上传文件。现在我不确定上传部分是否混乱或下载部分无法正常工作。因为我用一个非常简单的文本文件测试了代码,当我下载它时(从数据库) - 它充满了垃圾数据。这里是我用于这两个部分的代码

上传部分

public void uploadFile(FileUploader Dfile)
{

        DataHandler handler = Dfile.getDfile();
        InputStream is = handler.getInputStream();

        //Move input stream to byteArray
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] tmp = new byte[4096];
        int ret = 0;

        while((ret = is.read(tmp)) > 0)
        {
            bos.write(tmp, 0, ret);
        }

        byte[] myArray = bos.toByteArray();

        MySQL s = new MySQL();

        s.InsertFile(Dfile.getName(), myArray);
        is.close();
}//End method

这是数组被转储到数据库中的地方

public void InsertFile(String Fname , byte[] myArray )
{
   String sql = "INSERT INTO `uploadtest`.`File` (`Filename`,`Data`) VALUES ( \"" + Fname + "\",\"" + myArray + "\");" ;
   try 
   {
       //Insert it into the Db
       int a = stat.executeUpdate (sql);
   } 
   catch (IOException e)
   {
       e.printStackTrace();
   }
   catch (SQLException e) 
   {
    e.printStackTrace();
   }
}//end method

下载部分

这是我用于测试上传是否成功的代码

     String sql = "SELECT Data FROM uploadtest.File where filename=\"" + name + "\"";
    try 
       {
           ResultSet rs = stat.executeQuery(sql);
           Blob blob = null;
           InputStream inputStream = null;

           if(rs.next())
           {
            inputStream = rs.getBinaryStream("Data");
           }


            OutputStream out = new FileOutputStream(new File("d:\\somefile.mp3")); // Just to test if file retrieved from DB(blob type) was correct

            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = inputStream.read(bytes)) != -1)
            {
                out.write(bytes, 0, read);
            }

            inputStream.close();
            out.flush();
            out.close();

关于我可能会出错的任何建议?

4

1 回答 1

0

这是你出错的地方:

String sql = "INSERT INTO `uploadtest`.`File` (`Filename`,`Data`) VALUES ( \"" + Fname + "\",\"" + myArray + "\");" ;

就像您在下载部分使用流获取方法一样,您需要使用流方法将数据插入数据库。您现在所做的只是连接对象 myArray 的字符串表示形式。只是为了得到一个想法,尝试记录或打印变量 sql 中的值以查看它包含的内容并查看将执行的语句。

至于如何解决这个问题,您可以使用 PreparedStatement 然后使用 setBinaryStream() 或 setBlob() 并直接从数据处理程序中提交您的流,而无需字节流。这是一个示例:使用 JDBC 将文件数据插入 MySQL 数据库

关于这一点的最后一点说明:整个数据将在内存中传递,当文件变大时,您可能会从 java 或 mysql 获得与内存相关的问题。如果插入大文件,可以考虑将文件分块存储。您也可以考虑不将文件插入数据库。将文件保存在文件系统上并将它们组织到目录和子目录中。并且只将文件的路径存储在数据库中。

于 2013-04-01T10:56:40.350 回答