gpt4 book ai didi

java - 在 linux 服务器上部署的 java web 应用程序中上传文件时权限被拒绝

转载 作者:太空宇宙 更新时间:2023-11-04 12:03:29 26 4
gpt4 key购买 nike

我有一个 java web 应用程序,spring 4 和 jSTL 部署在安装在 linux 服务器上的 wildfly 上。在此应用程序中,我必须上传 Excel 文件以提取数据并在某些表格中注入(inject)漏洞。为此,我为 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 服务器中,在配置 floder out off wildfly 中创建的 tmp 文件夹具有以下凭据:

root@VM-XITS01-DEV:/opt/xerya_home# ls -ld
drwxr-xr-x 9 wildfly wildfly 4096 juil. 25 02:21

问题是当我从 Windows 操作系统上传 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() 与容器文件夹的绝对路径修复。

关于java - 在 linux 服务器上部署的 java web 应用程序中上传文件时权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51511017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com