본문 바로가기
리얼타임메디체크/전자 예진표(Flutter)

전자 서명 프로세스 추가(signature)

by Yun0415 2024. 7. 3.
반응형

전자 서명 프로세스 추가(signature)

 

전자 서명 팝업 프로세스를 보기 전에 Signature Pad in Flutter 라이브러리를 설치하고 오자 (아래 링크를 참고하자) ... 간단한 사용법도 제공하고 있다.

https://www.youtube.com/watch?v=RomU9gVHxpQ

 

선언하기

// pubspec.yaml -> 패키지 선언
dependencies:
  flutter:
    sdk: flutter
    
    # The following adds the Cupertino Icons font to your application.
    # Use with the CupertinoIcons class for iOS style icons.
  
    signature: ^5.0.0
    
    ...

 

다운로드

// command -> 패키지 선언 다운로드
flutter pub get

 

[전자 서명 생성 목적]

의사 계정으로 로그인 후 서명을 작성해야 의사 페이지에 모든 기능을 이용할 수 있다.

모든 기능을 이용할 수 있는 조건은 login & file/UPLOAD_FILES에서 받는 doctor_sign_path가 null 인지 null이 아닌지로 구분한다.

 

서명을 작성 후 file/UPLOAD_FILES & master/UPDATE_BUSINESS_AUTH호출한다.

file/UPLOAD_FILES이미지 파일을 저장하며, idx와 doctor_sign_path를 받아온다.

-> idx는 master/UPDATE_BUSINESS_AUTH에서 유저정보를 업데이트할 때 사용한다.

-> doctor_sign_path는 유저정보가 업데이트되지 않은 상태(다시 로그인하지 않은 상태)에서 유저가 서명을 수정하고 싶을 때를 대비해서 받아오고 있다.

master/UPDATE_BUSINESS_AUTHidx를 전달하여 로그인 후 doctor_sign_path를 받아올 수 있도록 유저정보를 업데이트해 준다.

 

[전자 서명 코드]

// 컨트롤러 설정
SignatureController controller = SignatureController(
    penStrokeWidth: 3, // 굵기
    penColor: Colors.black, // 색상
);

// 이미지 저장 공간 설정
Uint8List? exportedImage;

// 저장 프로세스
void saveHandle() async {
    // 이미지 pngByte로 저장
    exportedImage = await controller.toPngBytes();

    final response = await Session().post(
        "file/UPLOAD_FILES",
        exportedImage,
    );

    if (response['status'] == 200) {
        final responseUpdate = await Session().post(
            "master/UPDATE_BUSINESS_AUTH",
            {"doctor_sign_idx": response['data']['idx']},
        );
    }
}

// 다시 작성 프로세스
void rewriteHandle() async {
    controller.clear();
}

Signature(
    controller: controller,
    width: MediaQuery.of(context).size.width,
    height: 300,
    backgroundColor: const Color.fromARGB(255, 240, 240, 240),
)

 

[추가적인 고민사항]

file/UPLOAD_FILES를 호출할 때 아래와 같이 MultipartRequest를 사용하고 있다.

headers['Content-Type'] = 'multipart/form-data';

var request = new http.MultipartRequest('POST', uri);

request.files.add(
    http.MultipartFile.fromBytes(
        'files',
        data,
        filename: 'signature.png',
        contentType: MediaType('image', 'png'),
    ),
);

var streamedResponse = await request.send();

var responseBody = await streamedResponse.stream.bytesToString();

response = http.Response(responseBody, streamedResponse.statusCode, headers: streamedResponse.headers);

 

만약 ... 파일뿐만 아니라 추가적인 데이터를 서버 쪽에 전달하고 싶을 때는 어떤 식으로 해줘야 할까?

 

... 위 와 같은 코드

var request = new http.MultipartRequest('POST', uri);

... 추가된 코드 (addData를 추가로 보내고 싶은 데이터라고 가정하자)
if(addData != null) {
  request.fields['addData'] = addData;
}

request.files.add(
    http.MultipartFile.fromBytes(
        'files',
        data,
        filename: 'signature.png',
        contentType: MediaType('image', 'png'),
    ),
);

... 위 와 같은 코드

 

위 추가된 코드처럼 request.fields 안에 원하는 데이터를 같이 보내주면 된다.

 

[결과]

Signature Pad in Flutter 라이브러리를 사용하여 pngbyte를 MultipartRequest를 통해 서버에 전달해 보았다.또한 MultipartRequest는 일반적인 post 요청과는 다르니 따로 공부할 필요가 있을 것 같다.

반응형