2017-02-13 85 views
0

我正在使用Heroku和Spark框架上傳.json文件。Heroku + Spark框架:上傳文件可在本地使用,但不能在服務器上使用

HTML:

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

的Java:

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 
+0

您似乎沒有訪問創建文件夾「/公...嘗試位置=」公共/ RES」與‘/’的開始 – vgunnu

回答

0

Heroku的文件系統是不可變的,這意味着你不能寫信給它。您需要將文件作爲流讀取並將其發送到其他位置,如S3或數據庫。如果你只是試圖從中讀取數據,你可以評估json輸出。

關鍵是您需要選擇正確的流讀取器。默認情況下,許多類似上面的方法將文件系統上的東西放置在臨時目錄中作爲緩存,同時正在訪問流。這在Heroku中不起作用,因爲你不能在任何地方寫文件。所以你必須使用正確的流式閱讀器功能。這將取決於您正在使用的多部分庫。

+0

什麼你我只是想讀取文件並將其放入我的Gson對象中進行處理,我不需要將它保存到任何地方,我不太瞭解我使用的代碼的MultipartConfigElement(它是我使用的是javax.servlet.MultipartConfigElement,它看起來很標準。 – sikidhart

+0

我使用的大多數庫都有一個選項來禁用文件系統上的文件緩存。我對那個Java不熟悉,但我還沒有寫Java多年。 –

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

所以你現在使用的是客戶端解析器而不是服務器端? –

+0

是的,它的工作原理,但我有一些問題,當文件太大,所以我不得不添加一個壓縮/解壓步驟。 – sikidhart

相關問題