【发布时间】:2015-08-26 09:06:45
【问题描述】:
我在表单标签中有带有method="post" enctype="multipart/form-data"> 的jsp,带有@RequestParam CommonsMultipartFile otherDocs, 的Spring MVC 控制器和下面的代码用于将文件插入数据库
PreparedStatement pstmt = null;
try {
String fileName = fileItem.getName().substring(fileItem.getName().lastIndexOf("\\")+1, fileItem.getName().length());
File file = new File(fileItem.getName());
FileInputStream fis = new FileInputStream(file);
String sql = "INSERT INTO MyTable(formId, fileType, fileName, updateTime, updateUser, content) VALUES(?, ?, ?, getDate(), ?, ?)";
pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, id);
int len = (int)file.length();
if(fileItem.getContentType().endsWith(".document")){
pstmt.setString(2, "Document");
}else{
pstmt.setString(2, "else");
}
pstmt.setString(3, fileName);
pstmt.setString(4, userLoggedIn);
//pstmt.setBytes(5, bs);<------noted
pstmt.setBinaryStream(5, fis, len);
int count = pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
仅在设置了第 5 个参数时,在触发 executeUpdate() 后,我得到“字符串或二进制数据将被截断。”。我尝试在没有运行良好的第 5 个参数的情况下运行查询。
我也尝试使用带注释的“注释”行,得到相同的数据截断错误。
谢谢
杰
【问题讨论】:
-
您需要使用 blob 或 clob 将其保存在 DB 中,或者如果您想要一些简单的东西,则使用字节数组。我对 SQL 服务器一无所知,但我建议使用随机创建的标识符将文件保存在磁盘上,然后将标识符和路径保存在数据库中。如果您喜欢这种方法,我可以为您提供解决方案。
-
我无法使用您建议的方法。我正在使用带有“内容”的 SQL Server 作为 varbinary 数据类型。感谢您的评论。
-
好的。享受。让我知道是否有问题。
-
我试图获取我的表的定义,因为它显示“CHARACTER_MAXIMUM_LENGTH”为1。我认为它应该是-1。有什么猜测吗?
-
对 SQL 服务器一无所知。
标签: java sql-server spring spring-mvc file-upload