簡體   English   中英

Spring Boot-將文件上傳到服務器

[英]Spring Boot - Upload file to server

以下代碼提示用戶選擇本地存儲庫中的文件,輸入一些輸入字段,然后將文件上傳到服務器。 當前,它將由createTempFile創建它存儲在/ tmp文件夾中。 成功創建文件,並根據業務案例的需要創建對該文件的引用的對象。 好極了!

但是,我想將所有文件存儲在服務器存儲庫中一個單獨且可組織的文件夾中,例如“ / uploadedFiles”。

  1. 我嘗試了幾種方法,從在存儲庫文件夾中創建一個空文件,然后嘗試對其覆蓋,再到將上傳的文件復制到該文件夾​​中。 到目前為止,似乎沒有容易解決的問題都無法奏效,除非我錯過了明顯的事情(我可能這樣做了)。

  2. 所有創建的文件的文件擴展名后均帶有一長串數字,例如“ testfile.xls1612634232432”; 這是從inputstream的緩沖區獲取的嗎?

下面的代碼是當前的工作方式,只需將上傳的文件寫入/ tmp目錄中的臨時文件即可。 我需要將其保存到我選擇的任何其他目錄中,然后將其合格地傳遞給對象構造函數。

該方法從newTestUpload開始。

@MultipartConfig
@RestController
@RequestMapping(value = "/Teacher", produces = "text/html;charset=UTF-8")
public class Teacher {
    TestController testcont = TestController.getInstance();

    @GetMapping("")
    @ResponseBody

    public String homePage(@RequestParam(value = "file", required = false) String name, HttpServletRequest request,
            HttpServletResponse response) {

        StringBuilder sb = new StringBuilder();

        sb.append("<p> <a href='/Teacher/NewTest'>New Test upload</a></p>\n"
                + "<p><a href='/SelectTest'>Select Test File</a> <button type='button'>Send Test</button></p>"
                + "\n \n \n" + "<p><a>Current Test for students:</a>\n <a href='/getCurrentTest'></a></p>");

        return sb.toString();
    }

    @PostMapping
    @RequestMapping("/NewTest")
    @ResponseBody

    public String newTestUpload(HttpServletRequest request, HttpServletResponse response) {
        StringBuilder sb = new StringBuilder();
        try {

            if (!request.getParameterNames().hasMoreElements()) {
                sb.append("<p><form action='' method='post' enctype='multipart/form-data'>"
                        + "<label>Enter file</label><input type='file' name='file'>"

                        + "<button type='submit'>Upload</button></p>"

                        + "<p><form action='/testName'>Test Name: <input type='text' name='name' value=''></p>"

                        + "<p><form action='/addInfo'>Comment: <input type='text' comment='comment' value=''></p>"

                        + "<p>Answer 1: <input type='text' Answer='answer1' value=''></p>"

                        + "<p>Answer 2: <input type='text' Answer='answer2' value=''></p>"

                        + "</form>"

                        + "<a href='/Teacher'>Back</a>\n");
                return sb.toString();
            } else if (request.getParameter("name") != "" && request.getParameter("comment") != ""
                    && request.getParameter("answer1") != "" && request.getParameter("answer2") != "") {

                try {
                    // This is where the magic happens

                    Part filePart = request.getPart("file");
                    String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();

                    InputStream fileContent = filePart.getInputStream();

                    byte[] buffer = new byte[fileContent.available()];
                    fileContent.read(buffer);

                    File testExcel = File.createTempFile(fileName, "", null);

                    OutputStream outStream = new FileOutputStream(testExcel);
                    outStream.write(buffer);

                    // double ans1 =
                    // Double.parseDouble(request.getParameter("answer1"));
                    // double ans2 =
                    // Double.parseDouble(request.getParameter("answer2"));


                    Test test = new Test(testExcel, request.getParameter("name"), request.getParameter("comment"),
                            request.getParameter("answer1"), request.getParameter("answer2"));

                    testcont.addTest(test);

                    testExcel.deleteOnExit();
                    outStream.close();

                    sb.append("New test uploaded!<br/>\n<a href='/Teacher'>Back</a>\n" + testExcel.getPath()
                            + "<p>_________</p>" + test.getFile().getPath());
                    return sb.toString();

                } catch (Exception e) {
                    sb.append("<h1>Couldnt insert test</h1>\n" + e.getMessage() + e.getStackTrace() + e.getCause());
                    response.setStatus(HttpServletResponse.SC_OK);
                    e.printStackTrace();
                    return sb.toString();
                }

            } else {
                sb.append("failed<br/>\n<a href='/Teacher/NewTest'>Back</a>\n");
                response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
                return sb.toString();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";

    }

}

而不是創建臨時文件,而是在要創建的目錄中創建文件。

OutputStream outStream = new FileOutputStream(new File("<fileName>"));

如果要先創建沒有數據的文件。 您可以使用以下代碼,如果尚未創建目錄,它也會創建目錄:

    public static void saveToFile(String folderPath, String fileName) throws IOException {
        File directory = new File(folderPath);
        if (!directory.exists() && !directory.mkdirs()) {
            throw new IOException("Directory does not exist and could not be created");
        }
        String filePath = folderPath + File.separator + fileName;
        File theFile = new File(filePath);
        if (!theFile.exists()) {
            try {
                theFile.createNewFile();
            } catch (IOException e) {
                throw new IOException("Facing issues in creating file " + filePath, e);
            }
        }
    }
File testExcel = File.createTempFile(fileName, "", null);

替換為:

File testExcel = new File("/tests/", fileName);
testExcel.getParentFile().mkdirs();

做到了! 現在就像魅力一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM