微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

请求发布后获取上传的文件名-python

如何解决请求发布后获取上传的文件名-python

我有一个在Azure Kubernetes Service中运行的模型终结点,并且我没有使用Django或Flask。我正在发送本地png文件以得分,如下所示:

import base64
import json
import cv2
import requests

img_path = 'C:/path/to/exampleImage.png'
link = aks_service.scoring_uri
api_key = aks_service.get_keys()[0]

def send2score(img_path,score_url,api_key):
    headers = {'Content-Type': 'application/json','Authorization': ('Bearer ' + api_key)
               }
    
    img = cv2.imread(img_path)
    string = base64.b64encode(cv2.imencode('.png',img)[1]).decode()
    dict = {
        'img': string
        }
    jsonimg2 = json.dumps(dict,ensure_ascii=False,indent=4)
    resp = requests.post(url=link,data=jsonimg2,headers=headers)
    print(resp.text)    

send2score(img_path=img_path,score_url=link,api_key=api_key)

我的问题是:执行request.post之后,如何在Azure Kubernetes的分数脚本中获取文件名(exampleImage.png)?请不要使用Django或Flask特定的方法

奖金问题:请随意提出改进我上传数据的方式(send2score函数),该功能有效,我得到了分数,我只是无法在分数脚本中获取文件名。谢谢!

解决方法

根据您的代码,您将图像作为base64字符串发送。它不能包含文件名。我认为您需要定义一个参数来将文件名存储在请求正文中。此外,您还可以使用requests模块将文件发布为多部分编码文件。 例如

发送文件

import requests
import magic
import os
url = ''
path = "D:/sample/image/faces.jpg"

mime = magic.Magic(mime=True)

headers = {
    'Authorization': ('Bearer ' + 'cdff')
}
files = {'file': (os.path.basename(path),open(path,'rb'),mime.from_file(path),{'Expires': '0'})}
res = requests.post(url,files=files,headers=headers)
print(res.content.decode('utf-8'))


我的后端

from http.server import BaseHTTPRequestHandler,HTTPServer
import cgi
hostName = 
hostPort = 


class MyServer(BaseHTTPRequestHandler):
    def do_POST(self):
        try:
            // use cgi to read file
            form = cgi.FieldStorage(fp=self.rfile,headers=self.headers,environ={
                                    'REQUEST_METHOD': 'POST','CONTENT_TYPE': self.headers['Content-Type'],})
            file = form.list[0]
            data =file.file.read()
            #process data
            .............
            self.send_response(200)
            self.send_header("Content-type","text/html")
            self.end_headers()
            self.wfile.write(bytes(
                f"<html><head></head><body><h2>fileName : {file.filename}</h2>/html>","utf-8"))
            

        except Exception as e:
            httperror = e.httperror if hasattr(e,"httperror") else 500
            self.send_error(httperror,str(e))  # Send an error response


myServer = HTTPServer((hostName,hostPort),MyServer)
myServer.serve_forever()
,

我把事情弄的太复杂了,我意识到我将编码后的图像作为json发送到字典中。我可以在字典中包含其他信息,例如文件名:

import base64
import json
import cv2
import requests

img_path = 'C:/path/to/exampleImage.png'
link = aks_service.scoring_uri
api_key = aks_service.get_keys()[0]

def send2score(img_path,score_url,api_key):
    headers = {'Content-Type': 'application/json','Authorization': ('Bearer ' + api_key)
               }
    
    img = cv2.imread(img_path)
    string = base64.b64encode(cv2.imencode('.png',img)[1]).decode()
    dict = {
        'imgname': os.path.basename(img_path),'img': string
        }
    jsonimg2 = json.dumps(dict,ensure_ascii=False,indent=4)
    resp = requests.post(url=link,data=jsonimg2,headers=headers)
    print(resp.text)    

send2score(img_path=img_path,score_url=link,api_key=api_key)

我可以在得分脚本中获取图像和文件名:

# Lots of code before

response = json.loads(path)
string = response['img']
jpg_original = base64.b64decode(string) # decode
jpg_as_np = np.frombuffer(jpg_original,dtype=np.uint8)
img0 = cv2.imdecode(jpg_as_np,flags=1) # image
img0name = response['imgname'] # file name

# Lots of code after

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。