我是春天的初学者,我正在使用spring mvc 4 hibernate和mysql创建一个项目。在这个项目中,用户可以提交一份表格,其中包含他们的个人资料图片“手段,我需要提交数据和图像文件”。我可以将文件存储为数据库中的blob,但这不是一个好习惯,因此我只想在数据库中存储文件名。
到目前为止我做了什么: 我的xml配置中的multipartviewresolver, (commons fileupload,Commons io)在pom.xml中, 我使用servlet api 2.5, 我可以在数据库中上传图像文件
我会在显示我的代码之后讨论我的问题,
这是我的模特课。
@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();
}
}
问题是
你可以看到我在我的模型类中有一个私有的图像变量,该变量被定义为字符串,我在我的数据库中也有相同的列名定义as varchar 。为了存储图像文件名。
我的html表单中有输入类型文件,其路径等于图片。
在我的保存用户方法中,我使用 @modelattribute(用户)来映射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
我知道这个错误的原因: 我在模型类中将 image 变量声明为字符串类型。我不应该将我的图像字段声明为字节数组[],因为它不好将图像存储在数据库中确实我想将我的图像保存在服务器中。
问题仍然存在: 如何将文件名存储在数据库而不是文件中? 如何检索发送到@modelattribute(用户)的多部分文件数据,以便我可以将我的图像保存在服务器位置? 什么应该添加到我的控制器保存方法?我需要一个指导
请帮助我,我已经在互联网上闲逛了一个多星期,我无法解决问题。我只找到了byte array []的例子,那不是我想要的,谢谢
答案 0 :(得分:1)
您需要将image
属性的类型更改为org.springframework.web.multipart.commons.CommonsMultipartFile
,而不是将数组作为String。
例如private CommonsMultipartFile[] image;
然后在您的控制器中使用user.getImage()
,它会返回CommonsMultipartFile
类型的数组,对其进行迭代,并使用 API 为CommonsMultipartFile
获取let rootRef = FIRDatabase.database().reference()
let email = emailTextField.text
rootRef.child("users").queryEqualToValue(email, childKey: "users").observeEventType(.Value, withBlock: { snapshot in
if snapshot.exists() {
print("user exists")
} else if !snapshot.exists(){
print("user doesn't exist")
}
})
图像详细信息,您可以将图像存储到服务器。
答案 1 :(得分:1)
我现在在做什么!!这是我的模型类
@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 type'image'映射到我的模型类中的commonmultipartfile类型图像来实现我想要的。所以我离开了我的模型类中的字符串类型,并使用commonmultipartfile类型创建了新字段,并使用@transient注释它以便它不会被持久化。我在控制器中获取了multipartfile,并使用user.setImage()将其名称存储在数据库中,并正常保存在本地存储中。
谢谢你们的努力。答案 2 :(得分:0)
Rahul Yadav发布的答案&#39;应该有助于解决错误。
将文件存储在服务器上的特定文件夹下是个好主意。您可以使用用户标识本身来命名文件。这意味着无需在数据库中显式存储文件名,因为您可以从您的id派生它。 如果要存储多个文件,则可以定义文件命名可以遵循的约定。
假设您要添加用户照片,可以将其保存在某些位置/ userPhotos / as:
/userPhotos/1.jpg
/userPhotos/2.jpg
如果要将多个文件与用户关联,则可以为每个用户创建单独的文件夹 即
/data/1/1.jpg
/data/2/2.jpg
/someOtherFile.eg