2012-11-14 59 views
2

我想上傳CSV文件,並從那裏獲取詳細信息以填充MySQL數據庫。我正在使用Play!框架2與Java,但我很難實現這個解決方案。播放框架上傳文件不起作用

這是我的Java代碼

 public static Result uploadfile() { 
     File fl = request().body().asRaw().asFile(); 

      if (fl != null) { 


      return ok("File uploaded"); 
      } else { 
      flash("error", "Missing file"); 
      return redirect(routes.Application.index());  
      } 

這是我Upload.Scala.html代碼

@(uploadForm: Form[Application.upl]) 

    @import helper._ 

    @main("Upload file") { 
     @form(action = routes.Application.uploadfile) { 

     <input type="file" name="flname"> 

     <p> 
      <input type="submit" value="upload"> 
     </p> 

     } 
    } 

最後我routes文件

POST  /uploadfile    controllers.Application.uploadfile() 

有一次,我打上傳執行例外發生,說request().body().asRaw().asFile()實際上是null

[NullPointerException異常:空]

任何想法我做錯了嗎?

============================================== ===================================== 好,所以我現在的代碼如下 在應用程序。的java

public static Result uploadfile() { 
    play.mvc.Http.MultipartFormData body = request().body().asMultipartFormData(); 
    FilePart flpart = body.getFile("fl") ; 
    if (flpart != null) { 

     File file = flpart.getFile(); 
     ImportCSV impCSV = new ImportCSV(); 
     try{ 
      if (file.exists()) 
      { 
       BufferedReader br = new BufferedReader(new FileReader(file)); 
       System.out.println(file.getName() + " - " + file.getAbsolutePath()); 
       impCSV.importCSV(br); 
      } 
      else 
      { 
       System.out.println("File not found!"); 
       return redirect(routes.Application.upload()); 
      } 
     } 
     catch(Exception e) 
     { 
      System.err.println("Buffering file " + file.getName() +": " + e.getMessage()); 

     } 
     return ok("File uploaded"); 
    } else { 
     flash("error", "Missing file"); 
    return redirect(routes.Application.index());  
    } 
} 

而關於ImportCSV.java(它擴展模型)

public static void importCSV(BufferedReader br) 
{ 

    parseFile(br); 


    if(vals!=null) 
    { 
     Student student = new Student(); 
     List<Student> newStudents; 
     newStudents = GetStudentDetails(vals); 
     try{ 
      student.insertStudentList(newStudents); 
     } 
     catch(Exception e) 
     { 
      System.err.println("student inserting Error: " + e.getMessage()); 

     } 

    } 
} 

static void parseFile(BufferedReader br) { 
    try { 

      String line = ""; 
      StringTokenizer token = null; 
      int lineNum = 0, tokenNum = 0; 

      List<values> CSVvalues = new LinkedList<values>(); 
      values LnValues = new values(); 
      while((line = br.readLine()) != null) { 
       lineNum++; 

       // break comma separated file line by line 
       token = new StringTokenizer(line, ","); 
       LnValues = new values(); 
       while(token.hasMoreTokens()) { 
         tokenNum++; 
         switch(tokenNum) 
         { 
         //Student ID 
          case 0: 
          { 
           LnValues.setStudID(Long.getLong(token.nextToken())); 
          } 
          //Student Name 
          case 1: 
          { 
           LnValues.setStudName(token.nextToken()); 
          } 
          //Student DoB 
          case 2: 
          { 
           LnValues.setStudDoB(Date.valueOf(token.nextToken())); 
          } 
          //Class 
          case 3: 
          { 
           LnValues.setCl(token.nextToken()); 
          } 
          //Year 
          case 4: 
          { 
           LnValues.setYear(Integer.parseInt(token.nextToken())); 
          } 
          //Quarter 
          case 5: 
          { 
           LnValues.setQuarter(token.nextToken()); 
          } 
          //Maths Grade 
          case 6: 
          { 
           LnValues.setGradeM(Float.parseFloat(token.nextToken())); 
          } 
          //Computer Science Grade 
          case 7: 
          { 
           LnValues.setGradeCS(Float.parseFloat(token.nextToken())); 
          } 
          //Literature grade 
          case 8: 
          { 
           LnValues.setGradeL(Float.parseFloat(token.nextToken())); 
          }       

         } 


       } 
       CSVvalues.add(LnValues); 
       tokenNum = 0; 
      } 

      vals = CSVvalues; 
    } catch(Exception e) { 
      System.err.println("Parsing file Error: " + e.getMessage()); 

    } 

一旦我通過緩衝讀取器中的數據爲空。一開始我試圖將文件(文件fl)發送給參數,但我也得到了空錯誤。我在某些情況下嘗試了@Util註釋,但是編譯器抱怨沒有識別它! 我很樂意提供建議!

回答

3

有關於如何做到這一點在這裏說明: http://www.playframework.org/documentation/2.0/JavaFileUpload

request().body().asRaw().asFile();只有工作,如果你正在使用AJAX上傳的文件,相反,如果你使用的是正常POST要求,你應該嘗試在提出的解決方案通過使用

public static Result upload() { 
    MultipartFormData body = request().body().asMultipartFormData(); 
    FilePart picture = body.getFile("picture"); 
    if (picture != null) { 
     String fileName = picture.getFilename(); 
     String contentType = picture.getContentType(); 
     File file = picture.getFile(); 
     return ok("File uploaded"); 
    } else { 
     flash("error", "Missing file"); 
     return redirect(routes.Application.index());  
    } 
} 

而且文檔注意,你必須使用正確的表的格式,在這裏:

@form(action = routes.Application.upload, 'enctype -> "multipart/form-data")

+0

感謝您的回覆!我確實改變了代碼,但是一旦我將該文件傳遞給另一個解析函數的函數調用該文件爲空的異常!我甚至試圖將文件放入緩衝讀取器併發送它,但仍然... nada!使用@Util之前的函數在編譯期間創建一個錯誤,因爲找不到你!!!!! – XeonCy

+0

在第一個函數裏面它仍然有效嗎? – Nihathrael

+0

如果你指的是從窗體到結果函數的文件轉換,它似乎可以工作。但是,否則文件不會以任何方式發送到輔助功能。有任何想法如何解決這個問題? – XeonCy