2015-01-30 3 views
1

python 및 cherrypy의 초보자입니다. 파일 업로드 문제 - Python-WIndows-CheryyPy

@cherrypy.tools.noBodyProcess() 
def POST(self,theFile=None): 
    lcHDRS = {} 
    for key, val in cherrypy.request.headers.iteritems(): 
     lcHDRS[key.lower()] = val 
    formFields = myFieldStorage(fp=cherrypy.request.rfile, 
           headers=lcHDRS, 
           environ={'REQUEST_METHOD':'POST'}, 
           keep_blank_values=True) 

    dt = datetime.now() 
    date = dt.strftime('%Y-%m-%d') 
    dt = dt.strftime('%Y%m%d%H%M%S') 
    theFile = formFields['theFile'] 
    theFile.filename = str(dt) + "file" 
    shutil.copy2(theFile.file.name,os.path.join(absolutePath , theFile.filename)) 
    ... 
    ... 

내가 경로 os.path.join (absolutePath, theFile.filename)를 확인하고 적절한오고있다 : 나는 다음과 같은 코드를 사용하여 파일을 업로드하는 것을 시도하고있다. 문제는 코드가 Linux 우분투에서는 제대로 작동하지만 Windows에서는 제대로 작동하지 않는다는 것입니다. 호출 오류는 다음과 같습니다

shutil.copy2(theFile.file.name,settings.UPLOAD_FILE_PATH + theFile.filename) 
File "C:\Anaconda\lib\shutil.py", line 130, in copy2 
copyfile(src, dst) 
File "C:\Anaconda\lib\shutil.py", line 82, in copyfile 
with open(src, 'rb') as fsrc: 
IOError: [Errno 13] Permission denied: 'c:\\users\\username\\appdata\\local\\temp\\tmpjy3gys' 

을 편집 어디서 잘못된 것입니까? 다른 정보가 필요하면 알려주십시오.

+0

당신은'IOError'의 전체 스택 추적도 문제를 재현 할 수있는 실행 가능한 미리보기도 제공, 그래서 잘못되면 무엇을 어디에 있는지 어렵다. [답변] (http://stackoverflow.com/a/26299440/2072035)에서 스 니펫을 실행하여 동일한 예외가 발생하는지 여부를 알려주십시오. – saaj

+0

@saaj : 전체 오류 정보로 업데이트했습니다. – zennith

답변

2

문제는 파일 이름으로 다시 열기를 금지하는 일부 임시 파일 보안과 관련 될 수 있습니다. 와 shutil.copy2 전화를 대체 해보십시오 :

with open('/path/that/you/have/permission/to', 'wb') as f: 
    shutil.copyfileobj(theFile.file, f) 
+0

+1 안녕하세요. "열려있는"매력처럼 작동했습니다. 이전에 사용한 것과 같은 경로를 사용했지만. 이유를 설명해 주시겠습니까? – zennith

+0

@zennith 대답의 첫 번째 문장은 당신을 납득시키지 못합니까? 예를 들어 ['tempfile.mktemp'] (https://docs.python.org/2/library/tempfile.html?#tempfile.mktemp) 또는 ['os.tempnam'] (https : // docs .python.org/2/library/os.html # os.tempnam). 이것은 임시 파일을 템퍼링하는 것과는 별도의 프로세스를 방지하는 것입니다. 파이썬은 다시 열 수없는 임시 파일 핸들을 생성하는 Windows 관련 함수를 사용할 수 있습니다. 따라서'shutil.copyfileobj'는 이미 열려있는 파일과 같은 객체만을 읽습니다. – saaj

+0

완벽한! 감사. – zennith

0

Windows에서 프로그램 시작에 대한 UAC 제한이있는 것으로 생각됩니다. 관리자 권한으로 스크립트를 실행 해 보셨습니까?

+0

예. 그것은 작동하지 않지만. – zennith