본문 바로가기

System/Python

python으로 바이너리 파일 업로드

파일 전송으로 만들 것이 있어서 간단하게 만들어 봤어요.

 

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에선 알아서 받아줍니다.

 

소스파일 첨부해놨습니다.

 

공부용으로 만든거라 주석도 많이달아놨어요.




File_Upload.zip




출처 : 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