使用Spring将文件保存到资源目录

时间:2014-01-11 13:58:59

标签: java spring tomcat

我有这个项目结构:


/webapp
  /res
    /img
      /profile.jpg
  /WEB-INF

我需要将文件保存到res/img/目录。这次我有这段代码:


public String fileUpload(UploadedFile uploadedFile) {
        InputStream inputStream = null;
        OutputStream outputStream = null;
        MultipartFile file = uploadedFile.getFile();
        String fileName = file.getOriginalFilename();
        File newFile = new File("/res/img/" + fileName);

        try {
            inputStream = file.getInputStream();

            if (!newFile.exists()) {
                newFile.createNewFile();
            }
            outputStream = new FileOutputStream(newFile);
            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = inputStream.read(bytes)) != -1) {
                outputStream.write(bytes, 0, read);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return newFile.getAbsolutePath();
    }

但它将文件保存到user.dir目录,即~/Work/Tomcat/bin/。 那么如何将文件上传到res目录?

2 个答案:

答案 0 :(得分:11)

你不应该真的在那里上传文件。

如果您正在使用战争,重新部署将删除它们。如果它们是临时的,那么使用操作系统指定的临时位置。

如果您打算稍后发布它们,请选择在您的服务器上存储文件的位置,使该位置为应用程序所知,并从该位置保存和加载文件。

如果您尝试动态替换资源(例如html或css模板中引用的图像),请考虑单独发布外部位置,您可以使用mvc:resources来实现此目的:

<mvc:resources mapping="/images/**" location="file:/absolute/path/to/image/dir"/>

您可以将文件保存到该位置。这将使部署之间更加永久。

要使用您的代码将图像保存到该位置,您需要将其添加到bean定义中(假设您使用的是没有注释的xml配置):

<property name="imagesFolder" value="/absolute/path/to/image/dir"/>

并保持代码尽可能相似,将其更改为:

private String imagesFolder;
public void setImagesFolder(String imagesFolder) {
    this.imagesFolder = imagesFolder;
}
public String fileUpload(UploadedFile uploadedFile) {
    InputStream inputStream = null;
    OutputStream outputStream = null;
    MultipartFile file = uploadedFile.getFile();
    String fileName = file.getOriginalFilename();
    File newFile = new File(imagesFolder + fileName);

    try {
        inputStream = file.getInputStream();

        if (!newFile.exists()) {
            newFile.createNewFile();
        }
        outputStream = new FileOutputStream(newFile);
        int read = 0;
        byte[] bytes = new byte[1024];

        while ((read = inputStream.read(bytes)) != -1) {
            outputStream.write(bytes, 0, read);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return newFile.getAbsolutePath();
}

请记住,您需要将/ absolute / path / to / image / dir更改为存在的实际路径,我还建议您查看Spring Resources documentation以获得更好的处理文件的方法和资源。

答案 1 :(得分:3)

请从 here 引用FileUploadController以将文件保存到指定目录。

public String fileUpload(UploadedFile uploadedFile) {
    InputStream inputStream = null;
    OutputStream outputStream = null;
    MultipartFile file = uploadedFile.getFile();

    String rootPath = System.getProperty("user.dir");
    File dir = new File(rootPath + File.separator + "webapp"+File.separator+"res"+File.separator+"img");
    if (!dir.exists())
        dir.mkdirs();
    String fileName = file.getOriginalFilename();
    File serverFile = new File(dir.getAbsolutePath() + File.separator + fileName);

    try {
        inputStream = file.getInputStream();

        if (!newFile.exists()) {
            newFile.createNewFile();
        }
        outputStream = new FileOutputStream(newFile);
        int read = 0;
        byte[] bytes = new byte[1024];

        while ((read = inputStream.read(bytes)) != -1) {
            outputStream.write(bytes, 0, read);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return newFile.getAbsolutePath();
}