Java 使用DataHandler将文件上载到MySQL
我目前很难使用Java 使用DataHandler将文件上载到MySQL,java,mysql,web-services,cxf,datahandler,Java,Mysql,Web Services,Cxf,Datahandler,我目前很难使用数据处理程序将一个非常小的文件(.mp3)上传到MySQL数据库。我正在本地尝试代码,然后将其转换为Web服务。下面的“粗略”代码尝试上载该文件。现在我不确定是上传部分出错了还是下载部分不工作。因为我用一个非常简单的文本文件测试了代码,当我(从DB)下载时,代码中充满了垃圾数据。下面是我用于这两个部分的代码 上传部分 public void uploadFile(FileUploader Dfile) { DataHandler handler = Dfile.g
数据处理程序将一个非常小的文件(.mp3)上传到MySQL数据库。我正在本地尝试代码,然后将其转换为Web服务。下面的“粗略”代码尝试上载该文件。现在我不确定是上传部分出错了还是下载部分不工作。因为我用一个非常简单的文本文件测试了代码,当我(从DB)下载时,代码中充满了垃圾数据。下面是我用于这两个部分的代码
上传部分
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
下载部分
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
这是我用来测试上传是否成功的代码
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();
关于我可能出错的地方有什么建议吗?这就是你出错的地方:
String sql = "INSERT INTO `uploadtest`.`File` (`Filename`,`Data`) VALUES ( \"" + Fname + "\",\"" + myArray + "\");" ;
就像在下载部分使用流获取方法一样,您需要使用流方法将数据插入数据库。现在要做的只是连接对象myArray的字符串表示形式。为了了解情况,请尝试记录或打印变量sql中的值,以查看它包含的内容以及将执行的语句
至于如何解决这个问题,您可以使用PreparedStatement,然后使用setBinaryStream()或setBlob()并直接从数据处理程序中提交流,而不需要字节流。以下是一个例子:
最后一点注意:整个数据将在内存中传递,当文件变大时,java或mysql可能会出现与内存相关的问题。如果插入大文件,可以考虑将文件存储在块中。
您也可以考虑不将文件插入到数据库中。将文件保存在文件系统中,并将它们组织到目录和子目录中。并且只在数据库中存储文件的路径