Python上传图片的问题

Python初学者一枚,全自学,还学艺不精,写个自用的小程序,遇到问题,搜索引擎也没解决了,只有来请教各位。

我要上传图片到K手服务器,然后从K手服务器获得这张图片的URL地址,也就是新建商品的过程,新建商品的时候,需要上传一张主图,但是尝试多次未果。

img

img

用这个载荷能读取到token,但是在下面通过token获取图片的时候确实失败的,服务器也没有这张图片,所以我估计是我上传失败。

又在网上搜了一圈,说要加files,加了之后,也不行,报错

img

请求负载,我换了很多种方案也不行

img

img

不知道是哪里出的问题,求赐教,愿意请付茶水费用

解决方法

看你的报错,需要检查下面3点:

  1. post的参数时间问题,里面headers参数是否过期生效.
    如果失效,那么修改为最新的参数。
  2. post的数据files,data格式是否是这个url的 API所需要的,
    如果不是,调整为对应的格式
    目前看你的截图,data并没有用到上传上去.
  3. 如果前两步都没问题的话,确定你的这个URL的API一定能用。
    需要去URL的API服务端代码检查。

如有问题随时沟通
如有帮助欢迎采纳

引用 皆我百晓生 小程序回复内容作答:
在您提供的代码中,有一些错误和不完整的部分(可能是机器识别图片内容存在误差,如回答有误您可以直接附上源码)。下面是修正后的代码示例:

import requests

def image_upload():
    url = 'https://s.kwaixiaodian.com/gateway/h5/shop/material/b/upload/token/generate'
    
    headers = {
        'Accept': 'application/json',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Content-Length': '152',
        'Content-Type': 'application/json',
        'Cookie': 'did=web_11275567895F8ED7;did=web7op7gms4leac3i11856cin1ogkgypfpg;sid=kuaishou',
        'Host': 's.kwaixiaodian.com',
        'kpf': 'PC_WEB',
        'KS-CSRF-Token': '2C9C3FE099D27CA24E57B22288B253B5',
        'ks-s-ctn': 'dbd3876d-d37c-496b-acab-dc61f25d4739',
        'Origin': 'https://s.kwaixiaodian.com',
        'Referer': 'https://s.kwaixiaodian.com/zone/qoods/config/release/add',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebkit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
    }
    
    data = {
        "subjectType": "MERCHANT",
        "bizType": "MATERIAL_CENTER_PRODUCT_SUPPLY",
        "file": {
            "fileName": "4098b0b4-bf04-49d1-9939-596a7d38277a.png",
            "fileLength": 223996
        }
    }
    
    response = requests.post(url, headers=headers, json=data)
    print(response.text)
    response.close()

image_upload()

注意:

  1. 代码中的URL可能不准确,您需要确保URL的正确性。
  2. 在headers中,您需要修改'KS-CSRF-Token'的值为您自己的token,否则请求可能会被拒绝。
  3. JSON数据在data变量中通过字典的方式进行定义。
  4. 使用requests.post()方法发送POST请求并获取响应结果。
  5. 打印响应结果,以检查上传是否成功。

希望这可以帮助到您,如果还有其他问题,请随时提问。

题主,这个问题我来替你解决(参考结合AI智能、文心一言),若有帮助,还望采纳,点击回答右侧采纳即可。


你可以使用Python的requests库和MultipartEncoder类完成图片上传及获取图片URL。具体步骤如下:

  1. 安装requests库:在命令行窗口输入pip install requests

  2. 构造请求数据:使用MultipartEncoder类将图片数据和其他参数打包成Multi-Part Form Data格式的请求数据。

import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder

# 读取图片数据
with open('image.jpg', 'rb') as f:
    file_data = f.read()

# 构造请求参数
data = {
    'user_id': '12345',
    'image_name': 'image1.jpg',
    'image_data': ('image1.jpg', file_data, 'image/jpeg')
}

# 使用MultipartEncoder类打包请求数据
encoder = MultipartEncoder(fields=data, boundary='----WebKitFormBoundary7MA4YWxkTrZu0gW')
  1. 发送POST请求:将打包好的请求数据和请求头发送到K手服务器。
# 构造请求头
headers = {
    'Content-Type': encoder.content_type
}

# 发送POST请求
response = requests.post('http://ksou.com/upload', data=encoder, headers=headers)

# 解析响应数据
if response.status_code == 200:
    response_data = response.json()
    image_url = response_data['image_url']
    print('上传成功,图片URL为:', image_url)
else:
    print('上传失败')
  1. 获取图片URL:如果上传成功,K手服务器会返回一个JSON格式的响应数据,包含上传的图片URL地址。可以从响应数据中解析出图片URL并保存到本地或者展示在网页上。

注意事项:

  • 在发送POST请求时,要设置Content-Type为multipart/form-data,否则K手服务器会无法正确解析请求数据;
  • 在使用MultipartEncoder类打包请求数据时,要设置正确的boundary参数,否则会导致请求失败;
  • 如果上传的文件较大,可以考虑使用分块上传的方式,以减少内存占用和网络带宽消耗。

【以下回答由 GPT 生成】

问题分析

根据问题描述,你尝试将图片上传到K手服务器并获取上传后的图片URL地址,但是上传过程中遇到了问题。经过尝试,添加了"files"参数但仍然没有成功,并且出现了一些错误。现在你希望得到帮助解决这个问题。

根据情况描述,可能存在以下问题导致失败: 1. 请求中可能缺少必要的参数或头部信息。 2. 请求中的参数可能需要特定的格式或编码。 3. 请求可能没有进行正确的认证或授权。 4. 程序中可能存在其他错误或异常。

为了解决这个问题,可以按照以下步骤进行排查和修复。

解决方案

1. 确认请求参数和头部信息

首先,需要确认并补充请求中的必要参数和头部信息。根据你的情况,可能需要提供以下参数和头部信息: - 图片文件对象,需要使用 open() 函数打开并作为 "files" 参数的值提交。

import requests

image_file = open("path/to/image.jpg", "rb")
payload = {
    "files": image_file
}

response = requests.post(url, files=payload)

2. 检查参数格式和编码

如果请求中的参数需要特定的格式或编码,需要进行相应的处理。例如,某些接口可能要求将文件编码为 Base64 字符串再传输。

import requests
import base64

image_file = open("path/to/image.jpg", "rb")
base64_encoded_image = base64.b64encode(image_file.read()).decode('utf-8')

payload = {
    "image": base64_encoded_image
}

response = requests.post(url, data=payload)

3. 确认认证和授权

如果服务器需要认证或者授权才能上传图片,需要在请求头部信息中提供相应的认证或授权信息。例如,如果需要使用 API Key 或 Token 进行认证,可以在请求头部信息中添加相应的字段。

import requests

headers = {
    "Authorization": "Bearer your_token_here"
}

response = requests.post(url, headers=headers, files=payload)

4. 处理错误和异常

如果仍然无法成功上传图片,可能存在其他错误或异常。在代码中添加适当的错误处理机制,以便查看和排除可能出现的异常。

import requests

try:
    response = requests.post(url, files=payload)
    response.raise_for_status()  # 检查响应状态
except requests.exceptions.HTTPError as err:
    print(f"HTTP 错误: {err}")
except requests.exceptions.ConnectionError as err:
    print(f"连接错误: {err}")
except requests.exceptions.RequestException as err:
    print(f"其他错误: {err}")

总结

根据问题描述,以上是一种可行的解决方案。在实践中,可能还需要根据具体情况进一步调试和排查,例如查看服务器返回的错误信息、请求日志以及与服务器开发团队或接口提供方进行沟通。

如果以上解决方案仍然不能解决你的问题,可能需要更多的细节或者问题所在的具体代码来进一步分析。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

结合GPT给出回答如下请题主参考
上传图片到K手服务器,可以使用Python中的requests库进行实现。具体步骤如下:

1.导入requests库

import requests

2.打开图片并进行二进制读取

with open('图片路径', 'rb') as f:
    image_data = f.read()

3.设置上传请求的URL地址以及请求头部信息

url = 'http://服务器地址/upload'
headers = {'Content-Type': 'multipart/form-data'}

4.使用requests库进行图片上传

response = requests.post(url, headers=headers, data=image_data)

5.获取上传后的图片URL地址

image_url = response.json()['image_url']

完整的代码示例如下:

import requests

# 打开图片并进行二进制读取
with open('图片路径', 'rb') as f:
    image_data = f.read()

# 设置上传请求的URL地址以及请求头部信息
url = 'http://服务器地址/upload'
headers = {'Content-Type': 'multipart/form-data'}

# 使用requests库进行图片上传
response = requests.post(url, headers=headers, data=image_data)

# 获取上传后的图片URL地址
image_url = response.json()['image_url']

看下这篇文章:https://blog.csdn.net/xun527/article/details/108768824

参考gpt:
结合自己分析给你如下建议:
首先,您需要确保您的K手服务器支持图片上传的接口,并且了解它的请求参数和响应格式。一般来说,图片上传的接口需要使用POST方法,并且指定Content-Type为multipart/form-data。这样,您可以将图片作为文件对象发送到服务器,而不是作为普通的表单数据。
其次,您需要使用Python的requests库来发送HTTP请求,并且使用files参数来指定要上传的图片文件。例如,假设您要上传的图片文件名为image.jpg,那么您可以这样写:

import requests
# 假设这是K手服务器的图片上传接口的URL
url = "https://kshou.com/api/upload"
# 打开图片文件
file = open("image.jpg", "rb")
# 构造files参数,key是服务器接收文件的字段名,value是一个元组,包含文件名,文件对象和文件类型
files = {"file": ("image.jpg", file, "image/jpeg")}
# 发送POST请求
response = requests.post(url, files=files)
# 关闭文件
file.close()

最后,您需要从服务器的响应中获取图片的URL地址。这取决于服务器返回的数据格式,可能是JSON或XML等。您可以使用Python的json或xml库来解析响应数据,并提取出图片的URL地址。例如,假设服务器返回的数据格式是JSON,如下:

{
  "code": 200,
  "message": "success",
  "data": {
    "url": "https://kshou.com/image/123456.jpg"
  }
}

那么您可以这样写:

import json
# 将响应数据转换为Python字典
data = json.loads(response.text)
# 获取图片的URL地址
url = data["data"]["url"]
# 打印图片的URL地址
print(url)

不是提示网络服务异常吗?你开代理了?

一个很明显的错误,就是你的headers里面的Content-Type参数写错了,传文件不能用application/json,要用multipart/form-data;

res=requests.request("POST",url, data=None, files=files)

import requests


def upload(url , filename):
    name = filename+'.png'
    filepath = 'F:/桌面/' + filename+'.png'
    try:
        files = {'file': (name, open(filepath, 'rb'), 'image/png')}
    except:
        return "没有找到文件:{}.png".format(filename)
    headers = {}
    response = requests.request("POST", url, files=files, headers=headers)
    print(response.text)

Python如何将图片文件上传至服务器
可以参考下

将 url 替换为实际的服务器上传接口地址,同时将 file_path 替换为实际的图片路径。然后使用 requests.post() 方法发送 POST 请求,并将图片文件对象传递到 files 参数中。如果服务器返回 HTTP 状态码为 200,则说明上传成功,通过 response.json() 解析返回的 JSON 数据,并获取图片的 URL 地址

import requests

# 上传图片
def upload_image(file_path):
    url = "http://your_server_url.com/upload"  # 替换为实际的服务器上传接口地址
    files = {'file': open(file_path, 'rb')}  # 打开文件并创建文件对象
    
    response = requests.post(url, files=files)  # 发起 POST 请求上传文件
    
    if response.status_code == 200:
        # 返回图片的URL地址
        image_url = response.json()['url']
        return image_url
    else:
        return None

# 使用示例
image_path = "path/to/your/image.jpg"  # 替换为实际的图片路径
uploaded_url = upload_image(image_path)

if uploaded_url:
    print("成功上传图片,URL地址为:", uploaded_url)
else:
    print("上传图片失败")

可能是文件的问题或者是参数的问题:

def upload_file(file_path, url, token):
    headers = {'Authorization': 'Bearer {}'.format(token)}  # 假设token是这个授权方式
    with open(file_path, 'rb') as f:
        multipart_data = MultipartEncoder(fields={'file': ('filename.jpg', f, 'application/octet-stream')})
        response = requests.post(url, data=multipart_data, headers=headers, verify=True)  # verify 设置为 True 开启 SSL 证书验证
    return response

参考gpt
根据您提供的信息,您想通过Python将图片上传到K手服务器,并获取上传后的图片URL地址。根据您的代码和错误信息,有几个可能的问题和解决方法:

  1. 请求头中的Content-Type未正确设置:根据您的代码,您使用的是multipart/form-data类型的请求,但是在请求头中并未正确设置Content-Type。您可以尝试在请求头中添加以下代码来设置Content-Type
headers = {
    'Content-Type': 'multipart/form-data',
    'Authorization': 'Bearer ' + token
}
  1. 文件上传的字段名未正确设置:根据您的代码,您使用的是files参数来上传文件,但是您未指定上传文件的字段名。您可以尝试将以下代码添加到您的请求中,确保将file替换为您实际使用的字段名:
files = {
    'file': open('image.jpg', 'rb')  # 替换为您要上传的图片文件
}
  1. 请求URL未正确设置:根据您提供的信息,您需要将图片上传到K手服务器,并获取上传后的URL地址。请确保您的请求URL正确,并指向K手服务器的上传图片接口。

  2. 检查网络连接和服务器状态:如果以上步骤都没有解决问题,建议您检查您的网络连接是否正常,并确保K手服务器正常运行。

这个要先弄清楚照片在服务器上的url路径规则

打开控制台看看图片的url是什么情况,然后再根据规则拼出正确url

因为跨服务器跨域经常这样的,你看看能不能用上反向代理