繁体   English   中英

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

[英]Spring MVC Safe way to Upload, generate and download a file

我正在使用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>

当用户单击链接时,将调用另一个负责下载的控制器。 我不知道如何设计控制器,以便它可以与保存在temp文件夹中的编辑文件一起使用。 我认为它应该像这样:

    @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. 上传,生成和下载文件的过程是否安全? 还是有更好的方法来处理此过程?

我是Spring MVC和WebApp开发的新手,感谢每个建议:)

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

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

您所需要做的就是指向同一个文件,然后读取它。

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

使用系统临时目录

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);
  }
}

链接中获得了代码

  1. 实际上,这种方法并不安全。 如果2个不同的用户上载相同名称的文件怎么办?如果一个上载而另一个用户尝试下载该文件怎么办? 什么是数百万个文件? 等等等

最好使用独立的文件存储,但是对于测试项目来说很好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM