SpringBoot : 파일 업로드 및 액세스 구덩이에 (의 MultipartFile)

프로젝트 환경 SpringBoot 2.0.4, JDK8.0. CentOS7.0에 대한 서버 환경, Nginx의 버전을 잊어 버렸습니다.


머리말


의 MultipartFile 양식 파일에서 파일을 받아 사용하고 서버가 프로젝트의 가장 기본적인 요구이다 업로드 SpringBoot 프로젝트는 프레임 워크를 구축 SpringBoot를 사용할 때 너무의 MultipartFile 업로드 구덩이가 발생 될, 여기 말하는 내 이전 SpringMVC 기반으로 주로 두 개의 구덩이로 구성하는 본다.

  • 파일을 작성할 때 파일의 경로를 찾을 수 없습니다 transferTo () 메서드를 사용합니다.

  • Nginx에 파일 403 금지 문제에 접근 할 때.


파일을 작성할 때 파일의 경로를 찾을 수 없습니다 transferTo () 메소드를 사용하여


우리는 문제를 해결하기 전에, 우리는 포장 및 업로드 오류 로그의 방법을 확인합니다.

    public static final String BASE_PATH = "/test/";

    public static String upload(MultipartFile imageFile) {

        if (imageFile.isEmpty()) {
            return null;
        }
        String filename = imageFile.getOriginalFilename();
        
        String ext= null;
        if(filename.contains(".")){
            ext = filename.substring(filename.lastIndexOf("."));
        }else{
            ext = "";
        }
        
        String uuid =  UUID.randomUUID().toString().replaceAll("-", "");
        String nfileName = uuid + ext;
        String dirPath = DateFormatUtils.format(new Date(), "yyyyMMdd");
        String filepath = BASE_PATH.endsWith("/") ? BASE_PATH+dirPath : BASE_PATH+"/"+dirPath;
        File targetFile = new File(filepath, nfileName);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        } else {
            targetFile.delete();
        }
        try {
            imageFile.transferTo(targetFile);
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        String accessUrl =  "/"+nfileName;
        logger.debug("上传文件成功 URL:" + nfileName);
        return accessUrl;
    }

다음과 같은 오류 로그에 나타낸 바와 같이.

java.io.IOException: java.io.FileNotFoundException: /test/20181025/be3676dffca94c6dac5e96a1a41dcd97.jpg (Is a directory)
    at org.apache.catalina.core.ApplicationPart.write(ApplicationPart.java:122)
    at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile.transferTo(StandardMultipartHttpServletRequest.java:255)
    at com.dong.runline.common.utils.UploadUtils.upload(UploadUtils.java:56)
    at com.dong.runline.controller.TimeLineController.createTimeLineAction(TimeLineController.java:55)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

여기에 등장 java.io.FileNotFoundException의 이 우리가 다음 위치 오류가 발생했습니다 발견 디버그에 중단 점으로? 인한 어떻게, 실수를.

저는 여기에 지역 환경 테스트 및 경로의 종류, 최종 그림 같은 경로를 만드는 것입니다 만든 로컬 발견되었습니다 사용합니다.

SpringMVC 환경과 그러한 문제에서 다음을 일으키는 방법 결국, SpringBoot 이러한 문제가 등장했다? 많은 온라인 블로그가 문제의 핵심의 원인을 찾기 위해 transferTo () 메소드를 조회하여 작성.

@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
    this.part.write(dest.getPath());
}

우리는 다음 쓰기 () 메소드를 입력합니다.

    @Override
    public void write(String fileName) throws IOException {
        File file = new File(fileName);
        if (!file.isAbsolute()) {
            file = new File(location, fileName);
        }
        try {
            fileItem.write(file);
        } catch (Exception e) {
            throw new IOException(e);
        }
    }

우리가 경우 볼이 시간을 !file.isAbsolute()설립, 즉, 우리가 다음 절대 경로를 사용하지 않는 file = new File(location,fileName);원래 경로에 따라 위치를 추가합니다.이 그것도 해결하는 것은 매우 쉽습니다, 이유, 온라인 총 두 가지 옵션이 있습니다.

  • 절대 경로를 사용하여
  • 위치의 값을 수정

우리가 너무 많이 설명하지 않습니다 첫 번째 옵션은, 우리는 위치 값을 수정하는 방법을보고, 우리는 단지 클래스에 주입하기 위해 콩을 다음 시작해야합니다. 경로를 경로 우리 가게에.

    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        factory.setLocation(UploadUtils.BASE_PATH);
        return factory.createMultipartConfig();
    }

그런 다음 우리는 캔에 UploadUtils에서 파일을 만들 수있는 방법을 수정했습니다.

        String uuid =  UUID.randomUUID().toString().replaceAll("-", "");
        String nfileName = uuid + ext;
        File targetFile = new File(nfileName);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        } else {
            targetFile.delete();
        }


Nginx에 파일 403 금지 문제에 접근 할 때


사실 액세스 에러에 403 소위 Nginx에 오류가 발생했습니다. 현재 사용자가 리소스에 액세스 할 수있는 권한이 이해가되지 않습니다, 우리는 가능한 두 가지 옵션이 있습니다. 첫째, 파일 액세스 권한의 수준을 감소 . 둘째, 증가 사용자 액세스 권한을 여기에서 우리는 하나 하나 달성하는 방법에 대해 알아.

  • 파일 액세스 권한 수준을 감소

파일에 대한 액세스를 감소, 우리는 단지 사용할 필요 는 chmod 간략하게 설명 여기에있을 수있는 명령을 하려면 chmod 명령을 사용합니다.

맥을 사용하는 과정에서 우리는 종종 예를 들어 파일의 사용 권한을 수정 :

chmod 777 file

위의 설정하면, 모든 사용자가 파일 파일에 대한 전체 액세스 할 수 있습니다.

그런데 왜 세 자리 숫자는? 이는 파일 소유자의 사용자를 나타내는 세 자리 숫자, 그룹 그룹, 세 가지의 다른 기타 권리. 7의 권한 레벨 소유자, 그룹 권한 수준이다 7,도 7 다른 권한 레벨.

그런데 왜이 세 가지 리눅스 파일 권한의 총 R을 읽을 수 있기 때문에, 운영 X, w는 쓰기인가? 그것은 7. 해당 값은 사용자가 파일에 7의 값이 4,2,1을.이다 때, 그 파일에 대한 모든 권한이 의미하는 4 + 2 + 1이 시간.

그것은 말한다 chmod를이 방법 명령을 사용하여, 그 다음 우리는 파일 서버 사용할 수 있습니다 chmod를 664 파일 파일 액세스 권한의 수준을 감소 다음 명령을합니다. 모든 사용자가 파일에 액세스 할 수 있지만, 문제는되도록 사용자를 할 한 번 업로드, 우리는? 수동으로 우리가 할 수있는 방법을 다음, 분명 사실이 아니다 파일 권한을 수정하려면 우리는 사용자의 액세스 권한을 개선하기 위해 필요한이 시간이 필요합니다.

  • 증가 된 사용자 액세스 권한

실제로 Nginx에의 개시를 수정 여기에 사용자의 액세스 권한을 개선, 우리가 최대 공인 사람을 설정하여 시작, 우리는 파일에 액세스 할 수 있습니다.

첫째, 우리는 다음 지침은 Nginx에를 사용할 필요가 시작 누가 봐.

 ps aux | grep "nginx: worker process" | awk '{print $1}'

아래의 스크린 샷과 같이 여기에서 나는 변경했습니다.

원래 어떤 Nginx의 구성하지 않는 경우 첫 번째 루트, 즉, Nginx에의 개시 아무도 없어야 액세스를 설정. 이전 LS -l 파일이 ** 명령이 경우 파일 권한이 루트는 읽기 쿼리하여 ** 사용 루트 사람이 될 수있는 어떤 허가없이 다른 쓰기 권한은. 따라서, 우리는 시작해야합니다.

구성 파일은 {의 nginx는} 당신의 nginx 설치 경로를 나타냅니다 Nginx에 열린 위치.

vi {nginx}/conf/nginx.conf

아래 그림과 같이, 개시를 추가합니다.

user root

, sbin 디렉토리에 Ngnix를 구성 파일을 감지하고 다시 시작할 준비를 돌려줍니다.

cd ../sbin/

구성 파일의 검출 정확도

./nginx -t

아무 문제없이 감지, 다시 시작

./nginx -s reload

이 시간은 파일에 대한 일반 액세스 할 수 있습니다.


발문


이 블로그는 그냥 뭔가. 오신 것을 환영합니다주의 상 동을 매일 문제, 할 말이 더 깔끔. 아무것도 할 수 수집



원본 주소 : HTTPS : //www.jianshu.com/p/d8666f2e698f

추천

출처www.cnblogs.com/jpfss/p/10984123.html