当前位置: 首页 > 知识库问答 >
问题:

使用spring mvc和hibernate将文件名存储在数据库中,而不是文件本身

宿洋
2023-03-14

我是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(用户)的多部分文件数据,以便将图像保存在服务器位置?我的控制器保存方法应该添加什么?我需要一个指导

请帮帮我,我已经在网上徘徊了一个多星期,我无法解决这个问题。我只找到了字节数组[]示例,这不是我想要的,

非常感谢。

共有3个答案

孟子墨
2023-03-14

“Rahul Yadav”发布的答案应有助于解决错误。

最好将文件存储在服务器上的特定文件夹下。您可以使用用户id本身来命名文件。这意味着无需在数据库中显式存储文件名,因为您可以从id派生文件名。如果要存储多个文件,您可以定义文件命名可以遵循的约定。

假设要添加用户照片,可以将其保存在某个位置下,例如/userPhotos/as:

/userPhotos/1.jpg
/userPhotos/2.jpg

如果要将多个文件关联到一个用户,可以为每个用户创建单独的文件夹Viz。

/data/1/1.jpg
/data/2/2.jpg 
       /someOtherFile.eg
充星腾
2023-03-14

我现在在做什么!!这是我的模型课

@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(),并正常保存在本地存储中。

感谢大家的努力。

雷献
2023-03-14

您需要将图像属性的类型更改为组织。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文件中,而不是文件夹中?我以为必须使用这个技巧,但它没有。