0

我正在使用 Heroku 和 Spark 框架来上传 .json 文件。

HTML:

<form method="post" enctype="multipart/form-data" action="UploadJson">
    <input type="file" name="import_file" accept=".json" />
    <button>Upload</button>
</form&gt;

爪哇:

post("/UploadJson", "multipart/form-data", (request, response) -> {
    String location = "/public/res";
    long maxFileSize = 100000000;
    long maxRequestSize = 100000000;
    int fileSizeThreshold = 1024;
    MultipartConfigElement multipartConfigElement = new MultipartConfigElement(location, maxFileSize, maxRequestSize, fileSizeThreshold);
    request.raw().setAttribute("org.eclipse.jetty.multipartConfig", multipartConfigElement);

    try (InputStream inputStream = request.raw().getPart("import_file").getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    )

该代码在本地工作,但在 Heroku 中部署时出现以下错误:

java.io.IOException: No such file or directory
 at java.io.UnixFileSystem.createFileExclusively(Native Method)
 at java.io.File.createTempFile(File.java:2024)
 at org.eclipse.jetty.util.MultiPartInputStreamParser$MultiPart.createFile(MultiPartInputStreamParser.java:138)
 at org.eclipse.jetty.util.MultiPartInputStreamParser$MultiPart.write(MultiPartInputStreamParser.java:116)
 at org.eclipse.jetty.util.MultiPartInputStreamParser.parse(MultiPartInputStreamParser.java:690)
 at org.eclipse.jetty.util.MultiPartInputStreamParser.getParts(MultiPartInputStreamParser.java:405)
 at org.eclipse.jetty.server.Request.getParts(Request.java:2311)
 at org.eclipse.jetty.server.Request.getParts(Request.java:2290)
 at org.eclipse.jetty.server.Request.getPart(Request.java:2279)
 at javax.servlet.http.HttpServletRequestWrapper.getPart(HttpServletRequestWrapper.java:386)
 at Main.lambda$main$7(Main.java:146)

异常发生在

request.raw().getPart("import_file").getInputStream() part
4

2 回答 2

0

Heroku 的文件系统是不可变的,这意味着你不能写入它。您需要将文件作为流读取并将其发送到其他地方,例如 S3 或数据库。如果您只是想从中读取数据,则可以评估 json 输出。

关键是您需要选择正确的流式阅读器。默认情况下,像您这样的许多方法在访问流时将文件系统上的内容放在临时目录中作为缓存。这在 Heroku 中不起作用,因为您无法在任何地方写入文件。所以你必须使用正确的流阅读器功能。这将取决于您使用的多部分库。

于 2017-02-13T22:22:51.180 回答
0

我设法根据 Nathan Loyer 的建议找到了解决方法。在这里发帖以防有人觉得有帮助:

$(document).ready(function() {
    $("#import_file").on("change", function(event) {
        var file = event.target.files[0]; 
        var reader = new FileReader();

        reader.onload = function(evt) {
            if (evt.target.readyState != 2) return;
            if (evt.target.error) {
                alert('Error while reading file');
                return;
            }

            $("#json_contents").html(evt.target.result);
        };
        reader.readAsText(file);
    });
});
于 2017-02-15T00:55:54.890 回答