Spring MVC上传,生成和下载文件的安全方式

时间:2017-09-14 05:51:55

标签: java spring maven spring-mvc web-applications

我正在使用Spring MVC和Maven开发WebApp。我有以下过程:首先,用户必须上传文件。之后,将编辑上传的文件。最后但并非最不重要的是,我想创建一个包含已编辑文件的下载。

第一步“上传文件”效果很好。我有一个控制器,其中包含以下POST方法:

    @RequestMapping(value = "/CircleUp", method = RequestMethod.POST)
    public String circleUpPost(HttpServletRequest request, Model model, //
            @ModelAttribute("circleUpForm") CircleUpForm circleUpForm) {

        return this.doUpload(request, model, circleUpForm);
    }

    private String doUpload(HttpServletRequest request, Model model, //
            CircleUpForm circleUpForm) {

        File file = circleUpForm.getFile();

        if (file != null) {
            try {
//Some edit stuff
                serialize(file, SerializationModeEnum.Standard);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        model.addAttribute("uploadedFiles", file);
        return "uploadResult";
    }

    protected static String serialize(File file, SerializationModeEnum serializationMode) {

        java.io.File test = null;

        try {
            test = java.io.File.createTempFile("Test", ".pdf");
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            file.save(test, serializationMode);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // test.deleteOnExit();

        return test.getPath();
    }

在“序列化”方法中,我的PDFClown文件将保存到临时文件夹中。

之后将出现“uploadResult”页面,其中包含以下代码:

    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<html>
<head>
<meta charset="UTF-8">
<title>Download</title>
</head>
<body>
    <h3>Download Files:</h3>

    <a href="${pageContext.request.contextPath}/Download">CircleUp</a>

</body>
</html>

当用户点击链接时,将调用另一个处理下载的Controller。我不知道如何设计控制器,以便它可以使用我保存在临时文件夹中的已编辑文件。我认为应该是这样的:

    @RequestMapping(value = "/Download")
public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {


    final String temperotyFilePath = ???

    String fileName = "Test.pdf";
    response.setContentType("application/pdf");
    response.setHeader("Content-disposition", "attachment; filename=" + fileName);

    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        baos = convertPDFToByteArrayOutputStream(temperotyFilePath + "\\" + fileName);
        OutputStream os = response.getOutputStream();
        baos.writeTo(os);
        os.flush();
    } catch (Exception e1) {
        e1.printStackTrace();
    }

}

private ByteArrayOutputStream convertPDFToByteArrayOutputStream(String fileName) {

    InputStream inputStream = null;
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {

        inputStream = new FileInputStream(fileName);
        byte [] buffer = new byte [1024];
        baos = new ByteArrayOutputStream();

        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            baos.write(buffer, 0, bytesRead);
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return baos;
}

我现在有两个问题:

  1. DownloadController如何获得文件的临时路径?
  2. 上传,生成和下载文件的过程是否安全?或者有更好的方法来处理这个过程吗?
  3. 我是Spring MVC和WebApp Development的新手,我很感谢每一个建议:)

1 个答案:

答案 0 :(得分:1)

您可以使用在上传中使用的相同方法

test = java.io.File.createTempFile("Test", ".pdf");

您只需指向同一个文件然后阅读即可。

如果您需要保存文件的自定义目录,可以定义属性 - my.file.path=some path here

使用system temp dir

public class Main {
  public static void main(String[] args) {
    String property = "java.io.tmpdir";

    String tempDir = System.getProperty(property);
    System.out.println("OS current temporary directory is " + tempDir);
  }
}

获得the link

的代码
  1. 实际上这种做法并不安全。如果2个不同的用户上传具有相同名称的文件,该怎么办?如果一个上传而另一个用户试图下载该怎么办?什么文件数量是数百万?等等。
  2. 最好使用独立文件存储,但对于测试项目来说很好