1. 程式人生 > >簡易遠程文件上傳

簡易遠程文件上傳

優雅 __main__ href 遠程 相對 too 上傳 參數 self

      • 後臺搭建
        • 開心太早
        • 另類腳本
        • 部署
      • 客戶端
        • 源碼
        • 核心
      • 測試
        • 命令清單
        • 執行
        • 結果
      • 總結

一直以來,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

簡易遠程文件上傳