我是Spring初学者,我正在使用Spring mvc 4 hibernate和mysql创建一个项目。在这个项目中,用户可以提交一个带有他们的个人资料图片的表单“意味着,我需要连同图像文件一起提交数据”。我可以将文件作为blob存储在数据库中,但这不是一个好的做法,因此我试图在数据库中仅存储文件的名称。
到目前为止,我所做的工作是:在我的xml配置中使用multipartviewresolver,在pom中使用commons fileupload,commons io。xml,i'am using servlet api 2.5,我可以在数据库中上载imagefile
我将在展示我的代码后讨论我的问题,
这是我的模型课。
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@NotEmpty
@Size(max = 18, min = 5)
private String username;
//Alphanumeric password
@NotEmpty
private String password;
@NotEmpty
@Pattern(regexp="[^0-9]*")
private String fname;
private String mname;
@NotEmpty(message="Please Enter Lastname")
@Pattern(regexp="[^0-9]*")
private String lname;
@Pattern(regexp="[0-9]+")
private String roll;
private String faculty;
private String semester;
@NotNull
@DateTimeFormat(pattern="yyyy-mm-dd")
@Past
private Date dob;
private String gender ="male";
@NotEmpty
@Email
private String email;
@NotEmpty
@Pattern(regexp="[0-9]{10}")
private String contact;
@NotEmpty
private String address;
@NotEmpty
private String city;
private String country;
private int type;
private String image;
@Column(name = "created")
private Date created;
@Column(name = "updated")
private Date updated;
/*
@DateTimeFormat(pattern="yyyy-mm-dd hh:mm:ss")
private Date last_login;
*/
@NotEmpty
private String description;
这是我的Html表单:
<form:form
method="post" action="${pageContext.request.contextPath}/user/register"
modelAttribute="user"
enctype="multipart/form-data"
style="width:100%" >
<ul>
<li class="left">
<ul>
<li>Username <i>*</i></li>
<li>
<form:input class="fip" path="username" />
<form:errors path="username" cssClass="error" />
<!-- <span class="error">please enter valid information</span> -->
</li>
<li>First name <i>*</i> </li>
<li>
<form:input class="fip" path="fname" />
<form:errors cssClass="error" path="fname" />
</li>
<li>Last name <i>*</i> </li>
<li>
<form:input class="fip" path="lname" />
<form:errors cssClass="error" path="lname" />
</li>
<li>Faculty <i>*</i></li>
<li>
<form:select class="fsl" path="faculty">
<form:option value="NONE" label="--- Select faculty ---"/>
<form:options items="${Faculty}" />
</form:select>
</li>
<li>Email <i>*</i> </li>
<li>
<form:input class="fip" path="email" />
<form:errors cssClass="error" path="email" />
</li>
<li>Address <i>*</i> </li>
<li>
<form:input class="fip" path="address" />
<form:errors cssClass="error" path="address" />
</li>
<li>Country <i>*</i></li>
<li>
<form:select class="fsl" path="country">
<form:option value="NONE" label="--- Select Country ---"/>
<form:options items="${Country}" />
</form:select>
</li>
<li>Gender <i>*</i></li>
<li>
<div class="extra-bx">
<span><form:radiobutton value="male" path="gender"/> Male</span>
<span><form:radiobutton value="female" path="gender"/> Female</span>
</div>
</li>
</ul>
</li>
<li class="right">
<ul>
<li>Password <i>*</i> <small>(alphanumeric) exmple: nikesh9999</small> </li>
<li>
<form:input type="password" class="fip" path="password" />
<form:errors cssClass="error" path="password" />
</li>
<li>Mid name </li>
<li>
<form:input class="fip" path="mname" />
<form:errors cssClass="error" path="mname" />
</li>
<li>Roll <i>*</i> </li>
<li>
<form:input class="fip" path="roll" />
<form:errors cssClass="error" path="roll" />
</li>
<li>Semester <i>*</i></li>
<li>
<form:select class="fsl" path="semester">
<form:option value="NONE" label="--- Select Semester ---"/>
<form:options items="${Semester}" />
</form:select>
</li>
<li>Date of birth <i>*</i> </li>
<li>
<form:input class="fip datepicker" path="dob" />
<form:errors cssClass="error" path="dob" />
</li>
<li>Contact no. <i>*</i> </li>
<li>
<form:input class="fip" path="contact" />
<form:errors cssClass="error" path="contact" />
</li>
<li>City <i>*</i> </li>
<li>
<form:input class="fip" path="city" />
<form:errors cssClass="error" path="city" />
</li>
<li>Upload image <small>upload size (1 mb)</small></li>
<li>
<form:input type="file" class="fip" path="image" />
<form:errors cssClass="error" path="image" />
</li>
</ul>
</li>
<li>Description <i>*</i> <small> Describe yourself in words </small></li>
<li>
<form:textarea class="ckeditor" path="description" ></form:textarea>
<form:errors cssClass="error" path="description" />
</li>
<li class="submit">
<input type="submit" value="Save" name="submit" />
</li>
</ul>
</form:form>
这是我的控制器类
@Controller
@RequestMapping(value="/user")
public class userController {
@Autowired
private UserService userService;
@RequestMapping(value="/register",method = RequestMethod.GET)
public String userRegister (Model model) {
model.addAttribute("user", new User());
return "user/register";
}
@RequestMapping(value="/register", method = RequestMethod.POST)
public String saveUsers (HttpSession session, @ModelAttribute("user") @Valid User user, BindingResult result) {
if (result.hasErrors()){
return "user/register";
}
else {
// saving user
userService.saveUser(user);
// creating sesion
List<User> userlist = userService.createSession(user.getUsername(), user.getPassword());
iteratorUserList(session, userlist);
// redirecting
return "redirect:/user/"+user.getUsername();
}
}
问题是
您可以看到,在我的模型类中有一个私有image变量,它被定义为字符串,在我的数据库中也有相同的列名,它被定义为varchar。以存储图像文件名。
我有一个html表单中的输入类型文件,其路径等于图像。
在我的save user方法中,我使用了@modelattribute(user)来映射html表单和模型类。
当我提交我的表格我得到以下错误:
Failed to convert property value of type
[org.springframework.web.multipart.commons.CommonsMultipartFile]
to required type [java.lang.String] for property image; nested exception is
java.lang.IllegalStateException: Cannot convert value of type
[org.springframework.web.multipart.commons.CommonsMultipartFile] to required
type [java.lang.String] for property image: no matching editors or
conversion strategy found
我知道这个错误的原因:我在我的模型类中将图像变量声明为字符串类型。我不应该将我的图像字段声明为字节数组[],因为它不利于将图像存储在数据库中,事实上我想将我的图像保存在服务器中。
问题仍然是:如何在数据库中存储文件名而不是文件?如何检索发送给@modeldattribute(用户)的多部分文件数据,以便将图像保存在服务器位置?我的控制器保存方法应该添加什么?我需要一个指导
请帮帮我,我已经在网上徘徊了一个多星期,我无法解决这个问题。我只找到了字节数组[]示例,这不是我想要的,
非常感谢。
“Rahul Yadav”发布的答案应有助于解决错误。
最好将文件存储在服务器上的特定文件夹下。您可以使用用户id本身来命名文件。这意味着无需在数据库中显式存储文件名,因为您可以从id派生文件名。如果要存储多个文件,您可以定义文件命名可以遵循的约定。
假设要添加用户照片,可以将其保存在某个位置下,例如/userPhotos/as:
/userPhotos/1.jpg
/userPhotos/2.jpg
如果要将多个文件关联到一个用户,可以为每个用户创建单独的文件夹Viz。
/data/1/1.jpg
/data/2/2.jpg
/someOtherFile.eg
我现在在做什么!!这是我的模型课
@Transient
private CommonsMultipartFile[] imagefile;
private String image;
// and their respective setter and getter
这是我的html表单
<li>Upload image <small>upload size (1 mb)</small></li>
<li>
<form:input type="file" class="fip" path="imagefile" />
<form:errors cssClass="error" path="imagefile" />
</li>
和我的控制器类
@RequestMapping(value="/register", method = RequestMethod.POST)
public String saveUsers (HttpSession session, @ModelAttribute("user") @Valid User user, BindingResult result) throws FileNotFoundException, IOException {
// Getting uploaded file from the request object
CommonsMultipartFile[] cMultFiles = user.getImagefile();
if (result.hasErrors()){
return "user/register";
}
else {
// Iterate through the multipart array
for (CommonsMultipartFile multipartFile : cMultFiles) {
// Save the file to local disk and name in database
user.setImage(saveFileToLocalDisk(multipartFile));
// saving user
userService.saveUser(user);
// creating sesion
List<User> userlist = userService.createSession(user.getUsername(), user.getPassword());
iteratorUserList(session, userlist);
}
// redirecting
return "redirect:/user/"+user.getUsername();
}
}
通过将数据库的varchar类型“image”映射到模型类中的commonmultipartfile类型image,我无法实现我想要的。因此,我在模型类中保留了图像类型的字符串,并使用commonmultipartfile类型创建了新字段,并使用@transient对其进行注释,以便它不会被持久化。我在controller中获取了多部分文件,并使用user将其名称存储在数据库中。setImage(),并正常保存在本地存储中。
感谢大家的努力。
您需要将图像属性的类型更改为组织。springframework。网状物多部分。平民CommonsMultipartFile,而不是字符串,字符串将是数组。e、 g.<代码>私有CommonsMultipartFile[]图像
然后在控制器中使用用户获取。getImage(),它将返回类型为CommonMultipartFile的数组,对其进行迭代并使用CommonMultipartFile的API,您可以获取图像详细信息,并可以将图像存储到服务器。
我刚开始冬眠。我需要在postgres中存储文件,列的数据类型是。我在互联网上四处寻找这个案例的工作演示,但我找不到任何。 Hibernate映射:
问题内容: 我的一位客户要求为成千上万种不同格式(例如pdf,doc,docx等)的文档提供文档管理系统。我的问题是在数据库或文件系统中存储此文件的最佳方法是什么?两种方法之间如何轻松保护文档? 快速检索文件是关键要求。 我正在使用mysql如果有帮助 问候。 问题答案: 您可能希望将其直接存储到文件系统中。 使用文件系统时,请注意: 机密性: 将文档放在Apache文档根目录之外。然后,您的PH
问题内容: 我已经搜索了很多有关此问题的信息,但是我没有针对我的问题找到合适的解决方案,我有以下使用Java存储文件的方法, 当我尝试运行此代码时,出现以下错误, 请帮助我。 问题答案: 将文件数据转换为字节数组并在sql语句中设置
我想在我新创建的GitHub存储库中添加一个新文件夹,而不安装用于(Mac、Linux和Windows)的Git设置。有可能这样做吗? 当我在不同的系统/机器上工作时,我不能让Git一直陪伴在我身边。我知道如何在上的存储库中直接添加文件。我们也可以创建一个文件夹吗?
我有一个使用MS access作为数据库的JavaFX项目,在IntelliJ中创建可执行JAR后,在CMD中运行JAR时,我得到以下异常 这表示数据库文件不能被我的以下代码访问: 我已经检查了Jar文件,是的,它里面有“Account_Record.accdb”,当在IntelliJ IDE中运行JAR文件时,我没有错误,但无法使其独立!
我收到的流数据()希望保存在S3中(基本上,对于这个问题,我希望将输出保存在哪里并不重要,但我只是为了以防万一而提到它)。 是否可以将每个(这些是JSON字符串)数据保存到JSON文件中,而不是文件夹中?我以为必须使用这个技巧,但它没有。