Node JS에서 업로드된 파일의 유효성을 검사하는 방법

이 노트에서는 Node JS에서 파일 유효성 검사 및 압축을 처리하는 방법을 살펴보겠습니다.
유효성 검사 또는 압축을 처리하는 더 좋은 방법이 있으면 주석 섹션에 드롭하십시오.
대부분의 경우 파일은 Multer, busboy 또는 Formidable을 사용하여 Node JS 서버에서 구문 분석됩니다.
이 글에 사용된 콘텐츠는 Multer를 사용하지만 모든 시스템에 쉽게 적용할 수 있습니다.

파일 검증
Node JS의 파일은 일반적으로 JSON 형식입니다. 파일 형식은 아래에 표시된 두 가지 중 하나입니다.

// If memory storage is used
{
  fieldname: 'image',
  originalname: 'image.png',
  encoding: '7bit',
  mimetype: 'image/png',
  buffer: <Buffer bytes>,
  size: 25471
}

// If the file is stored locally
{
  fieldname: 'image',
  originalname: 'Meta1.png',
  encoding: '7bit',
  mimetype: 'image/png',
  destination: 'uploads/',
  filename: 'ed84692635f46d86c4be044f4acca667',
  path: 'uploads/ed84692635f46d86c4be044f4acca667',
  size: 25471
}


유효성 검사에 사용할 필드는 originalname, mimetype 및 size 필드입니다.

파일 확장자를 확인 중입니다.



우리는 파일 확장자를 얻기 위해 일부 내장된 JS 함수와 결합된 비트 오른쪽 시프트 연산자를 사용할 것입니다.

const file_extension = image.originalname.slice(
    ((image.originalname.lastIndexOf('.') - 1) >>> 0) + 2
);


위의 방법은 철자가 틀린 파일 이름(예: image.png.png, photo.jpeg.jeg)을 포함하여 98%의 사례에서 작동하는 것으로 입증되었습니다.

이제 파일 확장자가 있으므로 유효한지 확인할 수 있습니다.

// Array of allowed files
const array_of_allowed_files = ['png', 'jpeg', 'jpg', 'gif'];

// Get the extension of the uploaded file
const file_extension = image.originalname.slice(
    ((image.originalname.lastIndexOf('.') - 1) >>> 0) + 2
);

// Check if the uploaded file is allowed
if (!array_of_allowed_files.includes(file_extension)) {
  throw Error('Invalid file');
}


파일 확장자만 확인하는 것은 누구나 파일 이름을 편집하고 확장자를 변경할 수 있기 때문에 실용적이지 않습니다. 즉, 파일 이름을 todo-list.docx에서 todo-list.png로 쉽게 변경할 수 있습니다.

이러한 이유로 파일이 이미지인지 확인하기 위해 파일의 mimetype도 확인해야 합니다. 이를 수행할 때 유사한 접근 방식을 따를 것입니다.

const array_of_allowed_file_types = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif'];
if (!array_of_allowed_file_types.includes(image.memetype)) {
  throw Error('Invalid file');
}


두 수표를 결합하면

// Array of allowed files
const array_of_allowed_files = ['png', 'jpeg', 'jpg', 'gif'];
const array_of_allowed_file_types = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif'];

// Get the extension of the uploaded file
const file_extension = image.originalname.slice(
    ((image.originalname.lastIndexOf('.') - 1) >>> 0) + 2
);

// Check if the uploaded file is allowed
if (!array_of_allowed_files.includes(file_extension) || !array_of_allowed_file_types.includes(image.memetype)) {
  throw Error('Invalid file');
}


파일 크기 확인



파일 크기를 확인하기 위해 크기 필드를 사용합니다. 크기는 일반적으로 바이트 단위로 제공되므로 평가를 위해 원하는 형식으로 변환해야 합니다. 우리의 경우 MB로 변환했습니다.

// Allowed file size in mb
const allowed_file_size = 2;
if ((image.size / (1024 * 1024)) > allowed_file_size) {                  
  throw Error('File too large');
}


위의 유효성 검사를 종합하면 업로드된 파일의 유효성을 검사하는 express의 일반적인 미들웨어는 아래 코드와 같습니다.

export const auth = (req, res, next) => {
    const image = req.file;
    // Array of allowed files
    const array_of_allowed_files = ['png', 'jpeg', 'jpg', 'gif'];
    const array_of_allowed_file_types = ['image/png', 'image/jpeg', 'image/jpg', 'image/gif'];
    // Allowed file size in mb
    const allowed_file_size = 2;
    // Get the extension of the uploaded file
    const file_extension = image.originalname.slice(
        ((image.originalname.lastIndexOf('.') - 1) >>> 0) + 2
    );

    // Check if the uploaded file is allowed
    if (!array_of_allowed_files.includes(file_extension) || !array_of_allowed_file_types.includes(image.memetype)) {
        throw Error('Invalid file');
    }

    if ((image.size / (1024 * 1024)) > allowed_file_size) {                  
       throw Error('File too large');
    }
    return next();
}


결론



파일 유효성 검사는 매우 중요합니다. 이 글은 이미지와 단일 파일 업로드를 사용했지만 다른 파일 형식에서도 작동하도록 쉽게 수정할 수 있습니다. 루프 안에 추가하면 파일 배열도 확인할 수 있습니다.
코드는 쉽게 통합할 수 있는 NPM 패키지로 묶였습니다. 링크를 따라 찾으십시오. Fileguard .

좋은 웹페이지 즐겨찾기