整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          使用 Python Flask 創建簡易文件上傳服務

          在平時工作中,文件上傳是一項常見的需求,例如將應用異常時通過腳本生成的dump文件收集起來進行分析,但實現起來卻可能相當復雜。幸運的是,Flask框架提供了一種簡單而高效的方式來處理文件上傳,代碼不到100行。在本文中,我們將探討如何使用Flask實現文件上傳功能,編寫Dockerfile將應用程序通過docker部署。


          Flask 文件上傳流程

          Flask文件上傳的基本流程包括以下幾個步驟:

          1. 創建一個帶有 enctype=multipart/form-data 屬性的 <form> 表單,并在其中放置一個 <input type=file> 元素。
          2. 應用程序通過請求對象的 files 字典訪問文件。
          3. 使用文件的 save() 方法將文件保存到文件系統的某個位置。


          實現文件上傳

          以下是使用Flask實現文件上傳的示例代碼:

          # coding:utf-8
          
          import os
          from flask import Flask, flash, request, redirect, url_for, send_from_directory
          from werkzeug.utils import secure_filename
          
          UPLOAD_FOLDER = '/data/file_server/upload/'  # 上傳文件存儲的路徑
          ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'pcap'}  # 允許上傳的文件擴展名
          
          app = Flask(__name__)
          app.secret_key = '3ccfa213427578f707a015a87c5f94959df16cfd'
          app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
          
          # 檢查文件擴展名是否合法
          def allowed_file(filename):
              return '.' in filename and \
              filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
          
          # 上傳文件并重定向用戶到上傳后的文件URL
          @app.route('/', methods=['GET', 'POST'])
          def upload_file():
              if request.method == 'POST':
                  # 檢查請求中是否包含文件部分
                  if 'file' not in request.files:
                      flash('No file part')
                      return redirect(request.url)
                  file = request.files['file']
                  # 如果用戶沒有選擇文件,瀏覽器也會提交一個沒有文件名的空文件
                  if file.filename == '':
                      flash('No selected file')
                      return redirect(request.url)
                  if file and allowed_file(file.filename):
                      filename = secure_filename(file.filename)
                      file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
                      return redirect(url_for('uploaded_file', filename=filename))
              return '''
              <!doctype html>
              <title>Upload new File</title>
              <h1>Upload new File</h1>
              <form method=post enctype=multipart/form-data>
                <input type=file name=file>
                <input type=submit value=Upload>
              </form>
              '''
          
          # 提供已上傳文件的下載鏈接
          @app.route('/uploads/<filename>')
          def uploaded_file(filename):
              return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
          
          if __name__ == '__main__':
              from waitress import serve
              serve(app, host="0.0.0.0", port=9090)


          安全性考量

          在處理文件上傳時,安全性是一個重要的考慮因素。例如,我們不希望用戶能夠上傳任何文件類型,因為這可能導致跨站腳本攻擊(XSS)或其他安全問題。因此代碼邏輯加上限制允許上傳的文件擴展名后綴。


          另外對于上傳文件的文件名也是需要考慮的,secure_filename() 函數用于確保文件名的安全,防止路徑穿越攻擊。該函數會移除文件名中的路徑信息,只保留有效的文件名部分。不過由于secure_filename函數獲取中文文件名時,中文會被省略,所以文件名都要使用英文格式。

          secure_filename()函數


          限制上傳文件大小

          Flask 默認情況下會接受任意大小的文件上傳,但可以通過設置 MAX_CONTENT_LENGTH 配置鍵來限制最大允許的文件大小:

          app.config['MAX_CONTENT_LENGTH'] = 16 * 1000 * 1000  # 限制為16MB


          一般會搭配nginx反向代理來使用,可以通過Nginx的 client_max_body_size 指令控制上傳文件大小。


          Docker部署應用

          編寫Dockerfile

          FROM python:3
          
          WORKDIR /app/fileserver
          
          RUN pip install flask Werkzeug waitress --index-url http://mirrors.cloud.aliyuncs.com/pypi/simple/ --trusted-host mirrors.cloud.aliyuncs.com
          
          COPY fs.py ./
          
          CMD [ "python", "./fs.py" ]


          構建鏡像

          docker build -t flask-upload-app .


          啟動容器

          docker run -d --name flask-upload-app -v /data/file_server/upload/:/data/file_server/upload/ -p 9090:9090 flask-upload-app


          配置Nginx反向代理

          server {
              listen       31503 ;
              # flask上傳    
              location / {
                  proxy_set_header Host $http_host;
                  proxy_set_header X-Real-IP $remote_addr;
                  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                  proxy_pass http://localhost:9090/;
              }
          }


          測試上傳


          結語

          通過上述步驟,你可以編寫Flask應用輕松實現文件上傳功能,希望對大家有所幫助。如果你還有任何疑問,歡迎留言討論,或者關注我的微信公眾號運維小豬,謝謝!


          參考鏈接

          https://flask.palletsprojects.com/en/2.3.x/patterns/fileuploads/

          Flask中實現文件上傳和七牛云集成

          文件上傳是Web應用中常見的功能之一,而七牛云則提供了強大的云存儲服務,使得文件存儲和管理變得更加便捷。在本篇博客中,我們將學習如何在Flask應用中實現文件上傳,并將上傳的文件保存到七牛云。

          步驟 1: 安裝所需庫

          首先,確保已安裝Flask、SQLAlchemy(如果需要數據庫支持)、以及七牛云的Python SDK。可以使用pip進行安裝:

          pip install Flask Flask-SQLAlchemy qiniu


          步驟 2: 設置Flask應用

          在Flask應用中,我們需要配置數據庫(如果有)、七牛云以及路由來處理文件上傳。這包括設置七牛云的 access_key、secret_key、bucket_name 以及域名。

          
          from flask import Flask, request
          from flask_sqlalchemy import SQLAlchemy
          from qiniu import Auth, put_data
          
          app = Flask(__name__)
          app.config['SECRET_KEY'] = 'your-secret-key'  # 設置Flask的秘鑰
          
          # 配置SQLAlchemy數據庫
          app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@hostname/database'
          db = SQLAlchemy(app)
          
          # 配置七牛云
          auth = Auth(access_key='your-access-key', secret_key='your-secret-key')
          bucket_name = 'your-bucket-name'
          domain = 'your-domain'
          


          確保替換 your-secret-key、your-access-key、your-bucket-name 和 your-domain 為你的七牛云配置信息。分別是公鑰,私鑰,空間id,域名.其中公鑰和私鑰在個人中心-秘鑰管理查看.而空間id就是你的存儲空間的名字.

          步驟 3: 編寫上傳下載文件路由

          編寫一個路由,允許用戶上傳文件到七牛云。我們將使用 put_file 函數來實現文件的直接上傳。注意,你可以根據需要添加其他驗證邏輯。

          
          @app.route('/upload', methods=['POST'])
          def upload():
              if 'file' not in request.files:
                  return "沒有文件部分"
          
              file = request.files['file']
              if file.filename == '':
                  return "沒有選擇文件"
          
              with file.stream as data:
                  token = auth.upload_token(bucket_name, file.filename)
                  ret, info =put_file(token, file.filename, data)
          
              if info.status_code == 200:
                  file_url = f'http://{domain}/{file.filename}'
                  return f'文件上傳成功!<a href="{file_url}">查看文件</a>'
              else:
                  return "文件上傳失敗"
          


          這個路由接受POST請求中的文件,并使用 put_file 函數將文件上傳到七牛云。如果上傳成功,它會返回如圖所示

          key為文件名稱hash為tag.

          接下來就是下載文件.

          from qiniu import Auth
          
          access_key = 'your_AK'  # 替換為你的 Access Key
          secret_key = 'your_SK'  # 替換為你的 Secret Key
          q = Auth(access_key, secret_key)
          
          bucket_name = 'your_bucket_name'  # 替換為你的 bucket 的名字
          file_name = 'your_file_name'  # 替換為你要下載的文件名
          
          # 生成下載鏈接,有效期為 3600s
          private_url = q.private_download_url('http://'+ bucket_name +'.qiniudn.com/'+ file_name, expires=3600)
          print(private_url)
          

          這段代碼會輸出一個 URL,你可以在瀏覽器中打開這個 URL 來下載文件。請注意,這個 URL 在生成后的一小時內有效。

          而如果想在 Flask 中實現文件下載,我們可以創建一個路由來處理下載請求:

          from flask import Flask, redirect
          app = Flask(__name__)
          
          @app.route('/download/<file_name>')
          def download(file_name):
              private_url = q.private_download_url('http://'+ bucket_name +'.qiniudn.com/'+ file_name, expires=3600)
              return redirect(private_url)
          

          然后,我們可以通過訪問 http://your_server_address/download/your_file_name 來下載文件。

          步驟 4: 創建HTML表單

          最后,創建一個HTML表單,允許用戶選擇文件并將其上傳到你的Flask應用。你可以根據需要自定義表單樣式。

          
          <!DOCTYPE html>
          <html>
          <head>
              <title>文件上傳</title>
          </head>
          <body>
              <form method="POST" action="/upload" enctype="multipart/form-data">
                  <input type="file" name="file">
                  <input type="submit" value="上傳文件">
              </form>
          </body>
          </html>
          


          這段代碼構建了一個簡單的上傳表單,其中包含一個文件選擇字段和一個提交按鈕以方便我們觸發上傳。

          通過按照上述步驟,就可以在Flask應用中實現文件上傳和下載,將上傳的文件保存到七牛云并下載。


          作者:冷月半明
          鏈接:https://juejin.cn/post/7293786573677363227

          開發Web應用時,文件上傳功能是非常常見且重要的需求。今天,我們將通過Python Flask框架結合Flask-Uploads庫,實現文件上傳功能,并提供詳盡的代碼示例。

          安裝Flask-Uploads

          首先確保已安裝Flask和Flask-Uploads庫:

          pip install Flask Flask-Uploads
          

          初始化Flask應用與Flask-Uploads

          from flask import Flask, render_template, request
          from flask_uploads import UploadSet, configure_uploads, IMAGES, ALL
          
          app = Flask(__name__)
          app.config['UPLOADED_PHOTOS_DEST'] = 'static/uploads/'  # 設置文件上傳目錄
          
          photos = UploadSet('photos', IMAGES)  # 創建一個名為'photos'的上傳集合,僅接受圖片文件
          configure_uploads(app, photos)  # 將上傳集合與Flask應用綁定
          
          @app.route('/', methods=['GET', 'POST'])
          def upload_file():
              if request.method == 'POST' and 'photo' in request.files:
                  filename = photos.save(request.files['photo'])  # 保存上傳的文件
                  return render_template('uploaded.html', filename=filename)
              return render_template('upload.html')
          

          創建HTML模板

          1. 創建一個用于上傳文件的upload.html模板:
          <!DOCTYPE html>
          <html>
          <head>
              <title>文件上傳</title>
          </head>
          <body>
              <form method="POST" enctype="multipart/form-data">
                  <input type="file" name="photo">
                  <input type="submit" value="Upload">
              </form>
          </body>
          </html>
          
          1. 創建一個顯示已上傳文件鏈接的uploaded.html模板:
          <!DOCTYPE html>
          <html>
          <head>
              <title>文件上傳</title>
          </head>
          <body>
              <h1>問價上傳成功!</h1>
              <p>已經上傳的文件: <a href="{{ url_for('static', filename='uploads/' + filename) }}">{{ filename }}</a></p>
          </body>
          </html>
          

          配置與注意事項

          • UPLOADED_PHOTOS_DEST指定了上傳文件的存儲位置,需要注意的是,該路徑是相對于 Flask 應用的根目錄。
          • UploadSet中的第一個參數是上傳集合的名稱,第二個參數是文件類型過濾器,這里我們選擇了IMAGES,意味著只允許上傳圖片文件。如果需要上傳所有類型的文件,可以使用ALL。
          • photos.save(request.files['photo'])會將上傳的文件保存到指定目錄,并返回存儲后的文件名。
          • uploaded.html模板中,我們通過url_for函數生成上傳文件的靜態資源鏈接,用戶可以直接點擊瀏覽上傳的文件。

          總結

          通過以上步驟,我們已在Flask應用中成功實現了文件上傳功能。當然,實際項目中還需要考慮文件大小限制、文件重命名、文件類型檢查等更復雜的場景,Flask-Uploads庫同樣提供了相應的方法和選項供我們使用。

          關注我,手把手帶你快速入門Python Web編程!


          主站蜘蛛池模板: 久久一区二区三区精华液使用方法| 亚洲一区精品伊人久久伊人| 国产午夜三级一区二区三| 国产精品盗摄一区二区在线| 日韩精品一区在线| 肥臀熟女一区二区三区 | 精品欧洲av无码一区二区| 无码人妻精品一区二区三区99仓本| 无码人妻一区二区三区在线水卜樱| 中日韩一区二区三区| 末成年女AV片一区二区| 成人免费视频一区二区三区| 国产精品一区在线观看你懂的| 亚洲av无码一区二区三区乱子伦| 91精品福利一区二区| 男人免费视频一区二区在线观看 | 在线观看中文字幕一区| 国产精品免费一区二区三区| 精品黑人一区二区三区| 精品一区二区三区在线视频观看| 国模私拍一区二区三区| 国产福利酱国产一区二区| 国产成人无码AV一区二区在线观看| 精品欧洲AV无码一区二区男男| 日韩精品一区二区三区影院| 亚洲香蕉久久一区二区| 精品一区二区三区四区在线| 国产日韩精品视频一区二区三区| 精品国产香蕉伊思人在线在线亚洲一区二区| 亚洲国产精品一区第二页| 国产精品成人一区二区三区| 久久精品岛国av一区二区无码| 精品3d动漫视频一区在线观看| 色偷偷av一区二区三区| 一区二区三区免费高清视频| 亚洲乱色熟女一区二区三区蜜臀| 伊人精品视频一区二区三区| 国产免费私拍一区二区三区| 色妞色视频一区二区三区四区 | 视频一区二区三区在线观看| 毛片一区二区三区|