【问题标题】:Unable to save the uploaded file into specific directory无法将上传的文件保存到特定目录
【发布时间】:2016-06-15 18:50:13
【问题描述】:

我想上传文件并将它们保存到特定目录。我是文件概念的新手。当我从我的页面上传文件时,它们保存在另一个目录中(C:\Users\ROOTCP~1\AppData\Local\ Temp\multipartBody989135345617811478asTemporaryFile) 并且不在指定目录中。我无法设置它。请帮助我找到解决方案。提前感谢所有帮助。

  public static Result uploadHoFormsByHeadOffice() throws Exception {

    Logger.info("@C HoForms -->> uploadHoFormsByHeadOffice() -->> ");
    final String  basePath = System.getenv("INVOICE_HOME");

    play.mvc.Http.MultipartFormData body = request().body()
            .asMultipartFormData(); // get Form Body

    StringBuffer fileNameString = new StringBuffer(); // to save file path
                                                        // in DB
    String formType = body.asFormUrlEncoded().get("formType")[0];// get formType from select Box
    FilePart upFile = body.getFile("hoFiles");//get the file details
    String fileName = upFile.getFilename();//get the file name
    String contentType = upFile.getContentType(); 
    File file = upFile.getFile();

    //fileName = StringUtils.substringAfterLast(fileName, ".");

    // path to Upload Files
    File ftemp= new File(basePath +"HeadOfficeForms\\"+formType+"");

    //File ftemp = new File(basePath + "//HeadOfficeForms//" + formType); 
    File f1 = new File(ftemp.getAbsolutePath());// play

    ftemp.mkdirs();
     file.setWritable(true);
     file.setReadable(true);
     f1.setWritable(true);
     f1.setReadable(true);
     //HoForm.create(fileName, new Date(), formType); 

    Logger.info("@C HoForms -->> uploadHoFormsByHeadOffice() <<-- Redirecting to Upload Page for Head Office");
    return redirect(routes.HoForms.showHoFormUploadPage());
}

}

我真的很困惑为什么上传的文件保存在这个(C:\Users\ROOTCP~1\AppData\Local\Temp\multipartBody989135345617811478asTemporaryFile)路径中。

【问题讨论】:

  • INVOICE_HOME 的值是多少?
  • 基本路径的值为:D:\

标签: java file-upload playframework-2.0


【解决方案1】:

你快到了。

File file = upFile.getFile(); 是您通过表单输入获得的临时文件。您所要做的就是通过执行以下操作将此文件移动到您想要的位置:file.renameTo(ftemp)

您的代码中的问题是您在内存中创建了一堆文件 ftempf1,但您从未对它们做任何事情(比如将它们写入磁盘)。

另外,我建议您清理代码。很多它什么都不做(前面提到的f1,也是你正在做setWritable的块)。这将使调试变得容易得多。

【讨论】:

  • 这里也有一些问题。如果保存路径不是本地的(比如网络驱动器,或者 AWS 中的 EBS 驱动器),file.renameTo 将失败
【解决方案2】:

我相信当文件上传时,它会以您提供的名称存储在系统临时文件夹中。您可以将该文件复制到您喜欢的名称和位置。在您的代码中,您正在创建 File 对象 f1,它似乎是您希望文件结束的位置。

您需要进行文件复制以将文件从临时文件夹复制到您想要的文件夹。可能最简单的方法是使用 apache commons FileUtils 类。

File fileDest = new File(f1, "myDestFileName.txt");
try {
  FileUtils.copyFile(ftemp, fileDest);
}
catch(Exception ex) {
  ...
}

【讨论】:

  • 我真的很困惑我必须放在哪里?你能解释清楚吗。
猜你喜欢
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 2017-03-03
  • 2012-04-06
  • 1970-01-01
相关资源
最近更新 更多