[英]cgi python script seems not to receive uploaded file from html form
[英]Read from uploaded XLSX file in Python CGI script using Pandas
我正在創建一個工具
我想利用 Pandas 將 XLSX 文件讀入 dataframe,所以我可以輕松使用它。 但是,我無法讓它工作。 你能幫助我嗎?
從 CGI 文件中提取的示例:
import pandas as pd
import cgi
from mako.template import Template
from mako.lookup import TemplateLookup
import http.cookies as Cookie
import os
import tempfile
import shutil
import sys
cookie = Cookie.SimpleCookie(os.environ.get("HTTP_COOKIE"))
method = os.environ.get("REQUEST_METHOD", "GET")
templates = TemplateLookup(directories = ['templates'], output_encoding='utf-8')
if method == "GET": # This is for getting the page
template = templates.get_template("my.html")
sys.stdout.flush()
sys.stdout.buffer.write(b"Content-Type: text/html\n\n")
sys.stdout.buffer.write(
template.render())
if method == "POST":
form = cgi.FieldStorage()
print("Content-Type: application/vnd.ms-excel")
print("Content-Disposition: attachment; filename=NewFile.xlsx\n")
output_path = "/tmp/" + next(tempfile._get_candidate_names()) + '.xlsx'
data = *some pandas dataframe previously created*
if "editfile" in form:
myfilename = form['myfile'].filename
with open(myfilename, 'wb') as f:
f.write(form['myfile'].file.read())
data = pd.read_excel(myfilename)
data.to_excel(output_path)
with open(path, "rb") as f:
sys.stdout.flush()
shutil.copyfileobj(f, sys.stdout.buffer)
從 HTML 文件中提取的示例:
<p>Press the button below to generate a new version of the xlsx file</p>
<form method=post>
<p><input type=submit value='Generate new version of file' name='newfile'>
<div class="wrapper">
</div>
</form>
<br>
<p>Or upload a file.</p>
<p>In this case, a new file will be created using the contents of this file.</p>
<form method="post" enctype="multipart/form-data">
<input id="fileupload" name="myfile" type="file" />
<input value="Upload and create new file" name='editfile' type="submit" />
</form>
這在沒有if "editfile" in form:
bit 的情況下有效,所以我知道當我嘗試訪問用戶上傳的文件時出了點問題。
問題是在創建文件時,創建的文件的文件大小為 0 KB,並且不會在 Excel 中打開。 至關重要的是,在我寫出的位置找不到用戶上傳的文件。
您已將myfilename
傳遞給 pandas; 但是該文件在服務器上尚不存在。 在使用之前,您必須先將文件保存在本地某處。
以下將文件下載到當前目錄(與 CGI 腳本相同的目錄)。 當然,歡迎您將其保存到更合適的目錄中,具體取決於您的設置。
form = cgi.FieldStorage()
myfilename = form['myfile'].filename
with open(myfilename, 'wb') as f: # Save the file locally
f.write(form['myfile'].file.read())
data = pd.read_excel(myfilename)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.