![](/img/trans.png)
[英]On linux machine using tomcat for java web application, when i run application from tomcat, file/folder creation/modify permission denied issue
[英]Permission denied when upload file in java web application deployed on linux server
我有一個Spring 4和jstl部署在linux服務器上的wildfly上的Java Web應用程序。 在此應用中,我必須上傳Excel文件以提取數據並在某些表格中插入孔。 為此,我為multipart定義了此配置:
public class myAppServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
...
private static final String TEMP_FOLDER_NAME = "tmp"; // Temporary location where files will be stored
private static final long MAX_FILE_SIZE = 5242880; // 5MB : Max file size.
// Beyond that size spring will throw exception.
private static final long MAX_REQUEST_SIZE = 20971520; // 20MB : Total request size containing Multi part.
private static final int FILE_SIZE_THRESHOLD = 0; // Size threshold after which files will be written to disk
private MultipartConfigElement getMultipartConfigElement() {
StringBuilder uploadTempDirectoryUrl = new StringBuilder();
uploadTempDirectoryUrl.append(System.getenv(XeryaConstants.HOME_ENV_VARIABLE_NAME)).append(File.separator)
.append(TEMP_FOLDER_NAME);
File tempDirectory = new File(uploadTempDirectoryUrl.toString());
if (!tempDirectory.exists()) {
log.info("XeryaServletInitializer - Create temp directory " + uploadTempDirectoryUrl);
tempDirectory.mkdir();
}
log.info("XeryaServletInitializer - Multiplart temporal directory: " + uploadTempDirectoryUrl);
MultipartConfigElement multipartConfigElement = new MultipartConfigElement(System.getenv(AppConstants.HOME_ENV_VARIABLE_NAME),
MAX_FILE_SIZE, MAX_REQUEST_SIZE, FILE_SIZE_THRESHOLD);
return multipartConfigElement;
}
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
registration.setMultipartConfig(getMultipartConfigElement());
}
}
這是一般錯誤的方法代碼(**之間的行)
public static File convert(MultipartFile file) throws IOException
{
File convFile = new File(file.getOriginalFilename());
**convFile.createNewFile();**
FileOutputStream fos = new FileOutputStream(convFile);
fos.write(file.getBytes());
fos.close();
return convFile;
}
在linux服務器中,在配置文件中由wildfly創建的tmp文件夾具有以下憑據:
root@VM-XITS01-DEV:/opt/xerya_home# ls -ld
drwxr-xr-x 9 wildfly wildfly 4096 juil. 25 02:21
問題是當我從Windows OS上傳excel文件時,出現此錯誤:
2018-07-25 03:06:25,192 ERROR [stderr] (default task-47) java.io.IOException: Permission denied
2018-07-25 03:06:25,192 ERROR [stderr] (default task-47) at java.io.UnixFileSystem.createFileExclusively(Native Method)
2018-07-25 03:06:25,193 ERROR [stderr] (default task-47) at java.io.File.createNewFile(File.java:1012)
2018-07-25 03:06:25,193 ERROR [stderr] (default task-47) at com.xerya.school.util.XeryaUtils.convert(XeryaUtils.java:103)
2018-07-25 03:06:25,193 ERROR [stderr] (default task-47) at com.xerya.school.web.validator.rest.importdata.RestImportDataStudentController.uploadFile(RestImportDataStudentController.java:75)
有人可以幫我解決這個問題嗎? 在Windows中,一切正常。
我感謝大家的回應。 最后,我找到了錯誤。 它來自以下行:
File convFile = new File(file.getOriginalFilename());
要解決此問題,我可以通過以下方法進行更改:
String fileName = System.getenv(XeryaConstants.HOME_ENV_VARIABLE_NAME)
.concat(File.separator)
.concat(TEMP_FOLDER_NAME).concat(File.separator)
.concat(file.getOriginalFilename());
File convFile = new File(fileName);
當我查看getOriginalFilename文檔時,它說:“返回客戶端文件系統中的原始文件名。它可能包含路徑信息,具體取決於所使用的瀏覽器,但Opera除外。
我認為這可以解釋我得到的行為:當應用程序部署在Windows上並且從chrome開始上傳文件時,未發現任何錯誤。 但是,當應用程序部署在linux上並且我從chrome上傳文件時,發現了錯誤。 我后來通過concat file.getOriginalFilename()和容器文件夾的絕對路徑進行了修復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.