파일 전송으로 만들 것이 있어서 간단하게 만들어 봤어요.
Index.php
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
</head>
<body>
<form action="upload.php" method="POST" enctype="multipart/form-data">
<input type="file" name="file"><input type="submit" value="보내기">
</form>
</body>
</html>
upload.php
<?php
if(move_uploaded_file($_FILES[file][tmp_name],"웹서버 경로\".$_FILES[file][name])){
echo "성공";
}else{
echo "실패";
}
?>
file_post.py
#!/usr/bin/python
#-*-coding:utf-8 -*-
"""
2013-05-30
Made by d0ct0ro
Homepage : blog.d-c.kr
upload.php에 바이너리로 파일전송
Filename = post_file.py
"""
import socket,sys,os
#웹서버 주소설정
Ip = "1.229.153.21"
Port = 80
Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Socket.connect((Ip,Port))
def File_Post_Site(Data):
try :
Socket.send(Data)
except :
print "에러"
return
#python을 실행하기전 받은 인자값을 확인 없을시 스크립트 종료
if len(sys.argv) is 1:
print "읽을 파일명을 입력해주세용"
exit(1)
#파일이름이 있을경우 변수에 이름을 담음
Filename = sys.argv[1]
try :
#바이너리 모드로 파일을 연다
f = open(Filename,'rb')
#헤더 Content-Length에 담을 사이즈 구하기
Filesize = os.path.getsize(Filename)
#추가 사이즈 구하기
Size = """-----------------------------7dd5a16200bc
Content-Disposition: form-data; name="file"; filename="%s"
Content-Type: text/plain
-----------------------------7dd5a16200bc--"""% (Filename)
Filesize = len(Size) + Filesize
#헤더만들기
Header = """POST /upload.php HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, */*
Referer: http://%s/
Accept-Language: ko
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)
Content-Type: multipart/form-data; boundary=---------------------------7dd5a16200bc
Accept-Encoding: gzip, deflate
Host: %s
Content-Length: %s
Connection: Keep-Alive
Cache-Control: no-cache
-----------------------------7dd5a16200bc
Content-Disposition: form-data; name="file"; filename="%s"
Content-Type: text/plain
""" % (Ip,Ip,Filesize,Filename)
#헤더를 만들었으니 헤더를 보냄
File_Post_Site(Header)
while True :
#1024 byte씩 읽고 보냄
byte = f.read(1024)
File_Post_Site(byte)
#끝까지 다읽은경우 맨밑해더를 보낸후 while문을 break
if byte == '':
File_Post_Site("\n-----------------------------7dd5a16200bc--\n")
break
#파일닫기
f.close()
#오류 처리
except IOError:
print "파일을 열수 없습니다."
290MB 파일 보내는데 3초정도 걸리네요.
(물론 서버와 사용자의 인터넷의 속도차에 따라 크게 다릅니다.)
대략 방식은 첫 부분에서 파일 길이를 구한 다음 헤더를 보낸 후 1024바이트씩 읽어들여서 바로바로 헤더 보낸 뒤에 덧붙여주는 방식입니다.
속도 무지하게 빠르네요. 진짜 ㅋㅋ
사용법 : cmd 프롬프트 창에서 아래 명령어를 입력합니다.
file_post.py 파일명
이런식으로 쳐주시면 알아서 보내주고 PHP에선 알아서 받아줍니다.
소스파일 첨부해놨습니다.
공부용으로 만든거라 주석도 많이달아놨어요.
출처 : http://blog.d-c.kr/120191010917 [doctor O]
'System > Python' 카테고리의 다른 글
python 2.7.10 버전 설치 파일 (0) | 2015.11.25 |
---|---|
python 문자열 램덤 (0) | 2015.11.17 |
Python 내장함수 (0) | 2015.11.17 |