Heroku + Spark框架:上传文件在本地工作,但不在服务器上

时间:2017-02-13 01:46:12

标签: heroku spark-framework

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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);
    });
});