1. 程式人生 > >簡易遠端檔案上傳

簡易遠端檔案上傳

一直以來,Python的requests庫都沒能正式的接觸到。今天這麼一試,才發現原來是這麼的強大。感情之前的urllib, urllib2都沒這麼的智慧。於是思量著做了個小工具, 配合PHP寫了一個命令列下的檔案上傳小工具。

後臺搭建

開心太早

由於最後會在命令列裡面使用,所以用不著什麼花哨的介面(其實是寫不出來,╭(╯^╰)╮)。

大致的對比了一下,覺得還是前後端一致的好,然後就嘗試著使用Python寫檔案上傳處理的後臺邏輯。

東西都寫好了,利用Flask優雅的路由,實現的一個不錯的後臺。然後

完美! 原來這麼簡單哦。

然而終究是高興的太早,讓我嘗試著讓區域網中的同學測試一下幫忙測試一下的時候,發現了這個致命的問題。

網段內連線超時。 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!"; }

部署

接下來就是部署到伺服器上了。先在本地測試了一下,發現正常。然後就遠端登入到阿里雲的學生機伺服器上了。

當然了,我事先是配好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

核心

可能明眼的你一下就看出來了,核心就這麼一行:

result = requests.post(url, files=files)

指定files就好比是在表單中執行了

enctype=”multipart/form-data”

測試

命令清單

關於客戶端如何使用,可以使用help命令,便可輸出詳細的介紹文件。

python client.py -h

如圖:
命令清單

按照argparse的使用規範,在命令列中鍵入相對應的引數即可。

執行

結果

然後,遠端登入到伺服器上,看看到底有沒有上傳成功吧。

  • 對應客戶端的輸入命令,上傳的檔案為Spring.png。

Spring.png

  • 雙擊驗證圖片是否損壞

雙擊驗證圖片是否損壞

如此,前後端測試通過。

總結

這裡對於簡單的檔案上傳做了下實現,對比實際中會用得到的,這個小工具簡直不能入眼。不過還是那句話,貴在嘗試。

requests在本次的實驗中起到了至關重要的作用。但是其包含的遠遠不止這些,好有好多東西值得我們前去挖掘。往往精彩就在於細節。

學而時習之,學而時思之。

如果懶得弄,也可以留下您的郵箱, 與我取得聯絡。對於分享大業,在下樂意之至。(^__^) 嘻嘻……