2009-12-07 3 views
1

바이너리 파일을 작성하는 두 가지 방법이 있습니다. 첫째는 파일 업로드 (즉, enctype = "multipart/form-data"형식의 핸들링)에 해당하는 서버가받은 데이터로 작동하고 두 번째 방법은 파일 전자 메일 첨부 파일 (즉, get_payload()를 사용하여 전자 메일 메시지 본문을 구문 분석하여 얻은 파일 데이터)로 보낸 데이터.Python IO 전문가 :이 두 방법의 차이점은 무엇입니까?

이상한 점은 교환 할 수 없다는 것입니다. 이메일 첨부 파일에서 파싱 된 데이터를 저장하기 위해 첫 번째 파일을 사용하면 실패합니다. 마찬가지로 업로드 된 파일 데이터를 처리 할 때 두 번째 함수가 실패합니다.

중요한 차이점은 무엇입니까?

def write_binary_file (folder, filename, f, chunk_size=4096): 
    """Write the file data f to the folder and filename combination""" 
    result = False 
    if confirm_folder(folder): 
     try: 
      file_obj = open(os.path.join(folder, file_base_name(filename)), 'wb', chunk_size) 
      for file_chunk in read_buffer(f, chunk_size): 
       file_obj.write(file_chunk) 
      file_obj.close() 
      result = True 
     except (IOError): 
      print "file_utils.write_binary_file: could not write '%s' to '%s'" % (file_base_name(filename), folder) 
    return result 

이 두번째 방법 :

def write_binary_file (folder, filename, filedata): 
    """Write the binary file data to the folder and filename combination""" 
    result = False 
    if confirm_folder(folder): 
     try: 
      file_obj = open(os.path.join(folder, file_base_name(filename)), 'wb') 
      file_obj.write(filedata) 
      file_obj.close() 
      result = True 
     except (IOError): 
      print "file_utils.write_binary_file: could not write '%s' to '%s'" % (file_base_name(filename), folder) 
    return result 
+4

그것은 더 도움이 될 수 있습니다. 또한 read_buffer는 정확히 무엇입니까? – JimB

답변

0

가장 명백한 차이점은 데이터 청크 읽고

이 첫번째 방법이다. 당신은 오류를 지정하지 않지만, chunked 메소드가 read_buffer에 대한 호출에서 실패한 것 같습니다.

1

첫 번째 것은 파일과 유사한 객체를 매개 변수로 사용하여 데이터를 읽습니다. 두 번째 매개 변수는 실제 데이터가 기록 된 문자열로 기대합니다.

read_buffer 기능이 무엇인지 확인해야합니다.

2

차이점은 HTTP 업로드 방법 (첫 번째 것)은 파일과 같은 객체 자체 ("f"변수)를 매개 변수로 받고 CGI 모듈의 특정 "read_buffer"를 만들어 청크로 된 데이터를 읽습니다. 그 파일 객체를 실제 파일에 복사합니다.

Thsi는 http 업로드 응용 프로그램에서 의미가 있습니다. 파일 복사가 여전히 업로드되는 동안 시작할 수 있습니다. 개인적으로는 문제가되지 않을 것이라고 생각하지만 업로드시 수 메가 바이트 인 경우 http 모든 업로드가 어쨌든 완료 될 때까지 간단한 CGI 스크립트로 응답이 중단됩니다.

다른 방법은 매개 변수로 "file_data"를 수신합니다. allit은이 데이터를 새 파일에 기록해야합니다. (다른 하나는 파일과 같은 객체에서 데이터를 읽어야하고 그 객체에 대한 중간 객체를 생성합니다.)

두 번째 방법을 사용하면 HTTP 데이터를 저장할 수 있습니다. CGI 필드 값에 의해 제공되는 "f"인수로 두 번째 함수를 호출하는 대신 "f.read()"로 호출하여 모든 데이터를 "f" "파일과 같은 파일과 메서드에 의해 볼 수있는 해당 데이터. 우리는 당신이 너무 얻을 오류를 본 경우

즉 :

#second case: 
write_binary_file(folder, filename, f.read()) 
관련 문제