簡易遠程文件上傳
-
-
- 後臺搭建
- 開心太早
- 另類腳本
- 部署
- 客戶端
- 源碼
- 核心
- 測試
- 命令清單
- 執行
- 結果
- 總結
- 後臺搭建
-
一直以來,Python的requests庫都沒能正式的接觸到。今天這麽一試,才發現原來是這麽的強大。感情之前的urllib, urllib2都沒這麽的智能。於是思量著做了個小工具, 配合PHP寫了一個命令行下的文件上傳小工具。
後臺搭建
開心太早
由於最後會在命令行裏面使用,所以用不著什麽花哨的界面(其實是寫不出來,╭(╯^╰)╮)。
大致的對比了一下,覺得還是前後端一致的好,然後就嘗試著使用Python寫文件上傳處理的後臺邏輯。
東西都寫好了,利用Flask優雅的路由,實現的一個不錯的後臺。然後
http://127.0.0.1:5000/upload
完美! 原來這麽簡單哦。
然而終究是高興的太早,讓我嘗試著讓局域網中的同學測試一下幫忙測試一下的時候,發現了這個致命的問題。
http://192.168.···
網段內連接超時。 WTF,然後試了幾遍還是不行,後來就看代碼,一點點的排查,也沒有發現什麽錯誤。後來恍然大悟,需要部署到生產服務器上才行,OMG 忙活半天,把這件事給忘了。
然後也不想寫了,確切的說不想用Python寫了。
另類腳本
然後對比了一下Java和PHP。果斷選擇了PHP,不是不會用Java,而是不想搞得那麽復雜了,建工程,導包,配環境··· ···
用上PHP就好多了,幾個函數就搞定了嘛。(因為是自己用,所以錯誤檢查什麽的都沒做,實際開發中萬萬不可這樣。)
<?php
$storagepath = isset($_REQUEST[‘storagepath‘])?$_REQUEST[‘storagepath‘]: "./upload/";
$filename = $_FILES[‘file‘][‘name‘];
$tempfile = $_FILES[‘file‘][‘tmp_name‘];
if(file_exists($storagepath.$filename)) {
echo $storagepath.$filename." has existed!" ;
return;
}
if(move_uploaded_file($tempfile , $storagepath.$filename)){
echo "$filename uploaded succeed, and you can see at $storagepath !";
}else{
echo $_FILES[‘file‘][‘error‘];
echo "failed!";
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
部署
接下來就是部署到服務器上了。先在本地測試了一下,發現正常。然後就遠程登錄到阿裏雲的學生機服務器上了。
當然了,我事先是配好PHP+Apache環境了的。
把這個upload.php
文件放到htdoc文件夾下,然後再創建一個upload
文件夾(用於存放上傳的文件)。
這樣就完成了。如果不放心的話,可以先用瀏覽器測試一下,出現failed就說明部署成功了。
客戶端
客戶端當然還是用Python了,畢竟今天的主角是requests嘛。
源碼
#coding: utf-8
import requests
import argparse
# avoid numbers of http connection
requests.adapters.DEFAULT_RETRIES = 5
# close urllib3 keep-alive style
s = requests.session()
s.keep_alive = False
if __name__ == ‘__main__‘:
parser = argparse.ArgumentParser(description=‘tool for uploading file.‘)
parser.add_argument(‘url‘, type=str, help=‘the server url for handling upload work.‘)
parser.add_argument(‘-f‘, ‘--filepath‘, help=‘the full file path you want to upload‘)
args = parser.parse_args()
url = args.url
filepath = args.filepath
files = {
‘file‘: open(filepath, ‘rb‘)
}
# print url
# print filepath
result = requests.post(url, files=files)
print result.text
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
核心
可能明眼的你一下就看出來了,核心就這麽一行:
result = requests.post(url, files=files)
指定files就好比是在表單中執行了
enctype=”multipart/form-data”
測試
命令清單
關於客戶端如何使用,可以使用help命令,便可輸出詳細的介紹文檔。
python client.py -h
如圖:
按照argparse的使用規範,在命令行中鍵入相對應的參數即可。
執行
python client.py http://112.74.170.6/upload.php -f Spring.png
如圖:
結果
然後,遠程登錄到服務器上,看看到底有沒有上傳成功吧。
- 對應客戶端的輸入命令,上傳的文件為Spring.png。
- 雙擊驗證圖片是否損壞
如此,前後端測試通過。
總結
這裏對於簡單的文件上傳做了下實現,對比實際中會用得到的,這個小工具簡直不能入眼。不過還是那句話,貴在嘗試。
requests在本次的實驗中起到了至關重要的作用。但是其包含的遠遠不止這些,好有好多東西值得我們前去挖掘。往往精彩就在於細節。
學而時習之,學而時思之。
最後,如果對於那個圖片上的水印有興趣的話。可以參照博主前面的那個水印工具制作。
http://blog.csdn.net/marksinoberg/article/details/53363533
如果懶得弄,也可以留下您的郵箱, 與我取得聯系。對於分享大業,在下樂意之至。(^__^) 嘻嘻……
再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow
簡易遠程文件上傳