Hướng dẫn python requests post large file - python yêu cầu đăng tệp lớn

Tôi đã tìm kiếm các cách để tải lên tệp lớn với dữ liệu bổ sung, nhưng dường như không có giải pháp nào. Để tải lên tệp, tôi đã sử dụng mã này và nó hoạt động tốt với tệp nhỏ:

with open["my_file.csv", "rb"] as f:
    files = {"documents": ["my_file.csv", f, "application/octet-stream"]}
    data = {"composite": "NONE"}
    headers = {"Prefer": "respond-async"}
    resp = session.post["my/url", headers=headers, data=data, files=files]

Vấn đề là mã tải toàn bộ tệp trước khi gửi và tôi sẽ chạy vào MemoryError khi tải lên các tệp lớn. Tôi đã nhìn xung quanh và cách truyền dữ liệu là đặt

resp = session.post["my/url", headers=headers, data=f]

Nhưng tôi cần thêm {"composite": "none"} vào dữ liệu. Nếu không, máy chủ sẽ không nhận ra tệp.

Nếu bạn có một video lớn bạn cần tải lên, đôi khi máy chủ bạn đang tải lên sẽ không chấp nhận nó trong một yêu cầu. Máy chủ khác nhau có giới hạn khác nhau. Đối với API.video, bạn có thể tải lên một tệp video lên tới kích thước 199 MIB trước khi tệp của bạn được coi là quá lớn. Khi video của bạn vượt qua giới hạn này, để tải lên nó, bạn sẽ cần phải chia nó thành các khối và gửi nó theo cách đó. Bạn gửi từng khối và máy chủ lại cho bạn.

Trong hướng dẫn này, chúng tôi sẽ đi qua một ví dụ đơn giản về cách tải lên video lớn.

Điều này có vẻ như nó sẽ biến thành một tập tin video thực sự lớn.


Điều kiện tiên quyết

  • Khóa API API.Video

  • Bạn sẽ cần quyền truy cập vào Python và bạn sẽ cần cài đặt thư viện yêu cầu nếu bạn chưa thêm nó

Và nếu bạn muốn xem hướng dẫn này hơn là đọc nó, hãy xem video hướng dẫn của chúng tôi ở đây:

                    
                

Những gì bạn sẽ làm

Đây là một bản tóm tắt nhanh chóng về những gì bạn sẽ làm để tải lên video lớn của bạn.

  1. Bạn sẽ xác thực với API.video bằng khóa API của mình và truy xuất mã thông báo kéo dài một giờ mà bạn có thể sử dụng để truy cập tất cả các điểm cuối khác của API.Video.

  2. Bạn sẽ tạo một bộ chứa video cho video của bạn và truy xuất videoid.

  3. Bạn sẽ sử dụng Videoid để tạo điểm cuối, bạn sẽ gửi video của mình đến.

  4. Bạn sẽ chia tệp video của mình thành các phần, sau đó tải lên từng đoạn của tệp video.

Khắc phục sự cố / những gì cần coi chừng

Nếu bạn quyết định xây dựng trình tải lên của riêng mình, một vài điều sẽ giúp bạn:

  • Hãy nhớ rằng bạn phải mở tệp dưới dạng nhị phân và làm việc với nó dưới dạng nhị phân. Thật dễ dàng để quên và mở nó mà không cần thêm 'RB' hoặc tùy thuộc vào những gì bạn đang làm, 'WB'.

  • Tiêu đề rất quan trọng. Tiêu đề sai sẽ ngăn bạn gửi nội dung của bạn.

  • Khi sử dụng tiêu đề phạm vi nội dung, bạn phải đảm bảo rằng bạn đang liệt kê đúng bộ byte được gửi. Nếu bạn bị tắt ngay cả một byte, nó sẽ không hoạt động. Bạn sẽ nhận được các lỗi kỳ lạ như:

    resp = session.post["my/url", headers=headers, data=f]
    
    3 và giải pháp thường là một bản sửa lỗi đơn giản - sửa cách bạn liệt kê các byte của bạn trong tiêu đề.

  • Khi bạn gửi byte trong tiêu đề phạm vi nội dung, nó bao gồm. Nếu bạn muốn gửi 100 byte đầu tiên, bạn viết nó là 0-99. Điều này có thể gây nhầm lẫn khi bạn phá vỡ tệp của mình thành các khối vì bạn có thể nói 'lấy 100 byte đầu tiên' và máy tính biết để lấy 0-99. Khi bạn nói 'lấy 100 byte tiếp theo', máy tính sẽ lấy 100-199. Tuy nhiên, thật dễ dàng để viết một tiêu đề động trong đó bạn mắc lỗi như liệt kê 0-100 thay vì 0-99 hoặc bắt đầu lại trên cùng một byte, ví dụ 0-100, sau đó là 100-200. Tất cả các loại sai lầm này sẽ gây ra lỗi giải mã hoặc mã hóa. Nếu bạn chọn xây dựng trình tải lên của riêng mình thay vì sử dụng mẫu này, hãy ghi nhớ điều này.

  • Nếu bạn dán nhãn loại tệp bạn đang gửi, bạn có thể gây ra sự cố bất ngờ. Mẫu này hoạt động bằng cách mở, đọc và gửi tệp video của bạn dưới dạng các phần dữ liệu nhị phân. Khi nó đến, nó được mã hóa thành HLS cho bạn, bất kể loại video nào bắt đầu.

Mẫu mã

# How to upload a large video that is over 199 MiB to api.video. [Though this script will also work for videos under 200 MiB if you want to test it out.]

import requests
import os 

# Set up variables for endpoints [we will create the third URL programmatically later]
auth_url = "//ws.api.video/auth/api-key"
create_url = "//ws.api.video/videos"

# Set up headers and payload for first authentication request
headers = {
    "Accept": "application/json",
    "Content-Type": "application/json"
}

payload = {
    "apiKey": "your API key here"
}

# Send the first authentication request to get a token. The token can be used for one hour with the rest of the API endpoints.
response = requests.request["POST", auth_url, json=payload, headers=headers]
response = response.json[]
token = response.get["access_token"]

# Set up headers for authentication - the rest of the endpoints use Bearer authentication.

auth_string = "Bearer " + token

headers2 = {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": auth_string
}

# Create the video container payload, you can add more parameters if you like, check out the docs at //docs.api.video
payload2 = {
    "title": "Demo Vid from my Computer",
    "description": "Video upload test."
}

# Send the request to create the container, and retrieve the videoId from the response.
response = requests.request["POST", create_url, json=payload2, headers=headers2]
response = response.json[]
videoId = response["videoId"]

# Create endpoint to upload video to - you have to add the videoId into the URL
upload_url = create_url + "/" + videoId + "/source"

# Set up the chunk size. This is how much you want to read from the file every time you grab a new chunk of your file to read.
# If you're doing a big upload, the recommendation is 50 - 80 MB [50000000-80000000 bytes]. It's listed at 6MB [6000000 bytes] because 
# then you can try this sample code with a small file just to see how it will work.  The minimum size for a chunk is 5 MB.

CHUNK_SIZE = 6000000

# This is our chunk reader. This is what gets the next chunk of data ready to send.
def read_in_chunks[file_object, CHUNK_SIZE]:
    while True:
        data = file_object.read[CHUNK_SIZE]
        if not data:
            break
        yield data

# Upload your file by breaking it into chunks and sending each piece 
def upload[file, url]:
    content_name = str[file]
    content_path = os.path.abspath[file]
    content_size = os.stat[content_path].st_size

    print[content_name, content_path, content_size]

    f = open[content_path, "rb"]

    index = 0
    offset = 0
    headers = {}

    for chunk in read_in_chunks[f, CHUNK_SIZE]:
        offset = index + len[chunk]
        headers['Content-Range'] = 'bytes %s-%s/%s' % [index, offset -1, content_size]
        headers['Authorization'] = auth_string
        index = offset
        try:

            file = {"file": chunk}
            r = requests.post[url, files=file, headers=headers]
            print[r.json[]]
            print["r: %s, Content-Range: %s" % [r, headers['Content-Range']]]
        except Exception as e:
            print[e]

# Add a path to the file you want to upload, and away we go! 
upload['your-giant-file-here.mp4', upload_url]

Mã hướng dẫn

Bạn muốn biết làm thế nào nó hoạt động chi tiết hơn một chút? Tuyệt vời, chúng tôi đi đây! Một vài phần đầu tiên có thể trông giống như một số bài đăng trên blog khác, cuộn xuống để thảo luận về những thứ mới nếu đó là trường hợp.

Bạn sẽ bắt đầu bằng cách thêm các yêu cầu và thư viện HĐH, vì vậy bạn có thể dễ dàng thực hiện các yêu cầu HTTP.

import requests
import os

Tiếp theo, chúng ta hãy gán một biến cho mỗi điểm cuối chúng ta sẽ sử dụng, chúng sẽ dễ làm việc hơn một chút. Chúng tôi sẽ chỉ định hai trong số họ ở đây và chúng tôi sẽ sử dụng cái thứ hai sau để xây dựng cái thứ ba:

  • Điểm cuối xác thực - Đây là nơi chúng tôi gửi khóa API của chúng tôi để trao đổi nó cho một mã thông báo. Đó là auth_url trong mẫu mã. endpoint - This is where we send our API key to exchange it for a token. It's auth_url in the code sample.

  • Điểm cuối video - cụ thể chúng tôi sẽ sử dụng tính năng trên điểm cuối này để tạo video. Đó là created_url trong mẫu mã. endpoint - Specifically we'll use the feature on this endpoint that's for creating a video. It's create_url in the code sample.

  • Tải lên video về điểm cuối - Nó trông rất giống điểm cuối khác. Đó là create_url + "/Videoid" + "/Source". Chúng tôi sẽ xây dựng điều này sau khi chúng tôi có một videoid để làm việc. endpoint - It looks a lot like the other endpoint. It's create_url + "/videoId" + "/source". We'll construct this after we get a videoId to work with.

auth_url = "//ws.api.video/auth/api-key"
create_url = "//ws.api.video/videos"

Xác thực - Nhận mã thông báo của bạn

Chúng tôi sẽ chuẩn bị tiêu đề và tải trọng của mình để xác thực, sau đó gửi yêu cầu POST đến API.Video. Với API API.video, bạn bắt đầu xác thực bằng cách gửi yêu cầu bằng khóa API của bạn để truy xuất mã thông báo. Bạn có thể sử dụng hộp cát hoặc khóa sản xuất của mình, phụ trợ sẽ tìm ra những gì bạn đang sử dụng và xử lý nó cho phù hợp. Nếu bạn chọn sử dụng thông tin đăng nhập hộp cát của mình cho hướng dẫn này, video của bạn sẽ được tải lên với Watermark 'cho mục đích phát triển.'::

headers = {
    "Accept": "application/json",
    "Content-Type": "application/json"
}

payload = {
    "apiKey": "your API key here"
}
response = requests.request["POST", auth_url, json=payload, headers=headers]

Bây giờ chúng ta cần nhận mã thông báo từ phản hồi của mình, vì vậy chúng ta có thể xác thực với phần còn lại của điểm cuối của API.video khi chúng ta muốn làm điều gì đó. Để lấy mã thông báo, chúng tôi sẽ chuyển đổi phản hồi sang JSON, sau đó lấy mã thông báo ra khỏi từ điển JSON.

response = response.json[]
token = response["access_token"]

Thiết lập một bộ chứa video

Sử dụng mã thông báo, chúng tôi sẽ chuẩn bị sẵn các tiêu đề và tải trọng cho yêu cầu tiếp theo của chúng tôi, đó sẽ là yêu cầu API.video tạo một thùng chứa video cho chúng tôi.

# Set up headers for authentication
headers_bearer = {
    "Accept": "application/json",
    "Content-Type": "application/json",
    "Authorization": auth_string
}

# Create a video container
payload2 = {
    "title": "Demo Vid from my Computer",
    "description": "Video upload of Big Buck Bunny to demo how to do an upload from a folder on your computer."
}

api.video điểm cuối sử dụng xác thực người mang. Thêm tiêu đề ủy quyền để xác thực người mang vào danh sách các tiêu đề của bạn, và sau đó cho tải trọng, chúng tôi giữ cho nó đơn giản, chỉ là một tiêu đề và mô tả. Nhưng những gì về đường dẫn đến tệp của bạn? Đừng lo lắng, chúng tôi chỉ đang tạo một container ngay bây giờ. Khi bạn tải lên từ máy tính của mình, bạn tạo một container trước và thực hiện tải lên thứ hai.

Gửi yêu cầu của bạn và lấy Videoid

Đối với phần tiếp theo của hướng dẫn của chúng tôi, chúng tôi sẽ gửi yêu cầu của chúng tôi, chuyển đổi phản hồi sang JSON và truy xuất videoid. Chúng tôi cần Videoid để chúng tôi có thể nói API.video những gì chúng tôi muốn tải video của chúng tôi lên.

response = requests.request["POST", create_url, json=payload2, headers=headers_bearer]
response = response.json[]
videoId = response["videoId"]

Tạo điểm cuối để tải lên video của bạn

Thiết lập điểm cuối, bạn sẽ tải video của mình lên, bao gồm "//ws.api.video/videos" + "/" + Videoid + "/Nguồn".//ws.api.video/videos" + "/" + videoId + "/source".

Xây dựng một trình đọc nhạc chunk dữ liệu

Để chia dữ liệu của bạn thành các phần, bạn sẽ muốn quyết định mức độ lớn của mỗi đoạn, và sau đó từ một tệp mở, hãy tiếp tục lấy phần dữ liệu tiếp theo để đọc. Chúng tôi sẽ đặt kích thước chunk ở 1000000 byte. Điều này khá nhỏ, trong trường hợp bạn muốn thử mẫu với một tệp video nhỏ hơn để xem nó hoạt động như thế nào. Nếu bạn có kế hoạch bắt đầu sử dụng trình đọc chink dữ liệu này, hãy làm cho kích thước chunk lớn hơn. Một kích thước tốt là khoảng 50-80 MB hoặc khoảng 50000000-80000000 byte.

Chức năng này giả định rằng bạn đã mở tệp của mình ở nơi khác và nó sử dụng năng suất. Những gì điều này làm, là trả lại một máy phát điện. Mỗi khi bạn sử dụng chức năng này như là một phần của vòng lặp, nó sẽ chạy cho đến khi nó đạt được, sau đó trả về giá trị. Năng suất 'nhớ lại' nơi bạn rời đi, vì vậy mỗi lần bạn vòng qua, nó sẽ trả lại một đoạn dữ liệu mới.yield. What this does, is return a generator. Every time you use this function as part of a for loop, it will run until it hits yield, then return the value. Yield 'remembers' where you left off, so each time you loop through, it will return a new chunk of data.

resp = session.post["my/url", headers=headers, data=f]
0

Bắt đầu tải lên video lớn của bạn


Đây là chức năng tiếp theo của chúng tôi. Đây là chức năng tải lên, và nó chứa trình đọc chunk của chúng tôi. Những gì chúng tôi làm ở đây, là sử dụng thư viện HĐH để lấy một số chi tiết tệp, vì vậy chúng tôi biết tệp chúng tôi sẽ gửi lớn như thế nào, đường dẫn để đến nó và tên của tệp.

Chúng tôi mở tập tin của chúng tôi và lưu ý ... chúng tôi đang mở tập tin của chúng tôi trong nhị phân. Điều này rất quan trọng cần nhớ, vì việc mở một tệp video ở các định dạng khác có thể sẽ không hoạt động.

Tiếp theo, chúng tôi thiết lập chỉ mục của chúng tôi, điều đó sẽ thể hiện điểm nào chúng tôi đang ở trong tệp. Chúng tôi cũng thiết lập phần bù, đại diện cho việc di chuyển chỉ mục về phía trước sau khi chúng tôi gửi từng đoạn.

Sau đó, chúng tôi bắt đầu đọc các khối dữ liệu. Đối với mỗi phần dữ liệu, chúng tôi chuẩn bị tiêu đề phạm vi nội dung để chúng tôi liệt kê chính xác phần nào của tệp chúng tôi đang gửi trong byte. Để gửi đoạn dữ liệu của chúng tôi, chúng tôi cần đặt nó vào một từ điển tệp một mục. Chúng tôi làm điều đó, và sau đó để dễ đọc gán nó cho một biến. Sau đó, chúng tôi gửi yêu cầu của chúng tôi! Điều này sẽ vượt qua cho đến khi chúng tôi ra khỏi các khối dữ liệu [phần cuối cùng có thể sẽ nhỏ hơn so với các phần khác].

resp = session.post["my/url", headers=headers, data=f]
1

Bạn không cần bất kỳ tiêu đề nào khác.

Bạn sẽ biết bạn đã thành công sau khi bạn gửi đoạn cuối cùng. Có thể nhận được phản hồi -200- cho mỗi đoạn, sau đó không có kết quả ở cuối, vì vậy hãy đảm bảo xem video của bạn tải lên lần đầu tiên. Thành công được biểu thị bằng phản hồi cho đoạn cuối cùng, nơi bạn sẽ nhận được thứ gì đó trông giống như thế này:

resp = session.post["my/url", headers=headers, data=f]
2

Kiểm tra trạng thái video của bạn trong bảng điều khiển của bạn. Nếu bạn có một tệp video rất lớn, hãy đợi một vài phút trong khi API.video hoàn thành xử lý nó. Khi xử lý kết thúc, bạn sẽ có thể thấy một hình thu nhỏ cho video của bạn và phát nó từ bảng điều khiển.your dashboard. If you have a very large video file, wait a few minutes while api.video finishes processing it. When processing is finished, you'll be able to see a thumbnail for your video and play it from the dashboard.

Nếu tải lên video của bạn không thành công, bạn sẽ không nhận được tin nhắn chi tiết được liệt kê ở trên. Bạn có thể nhận được thêm 200 phản hồi hoặc phản hồi 400 cho mỗi đoạn, tùy thuộc vào mức độ đã sai với tải lên của bạn. Trong bảng điều khiển, bạn có thể thấy video của mình được tải lên, nhưng nó vẫn bị mắc kẹt trong quá trình xử lý. Nếu điều này xảy ra, hãy xem lại mã của bạn hoặc liên hệ với chúng tôi với vấn đề của bạn trong diễn đàn cộng đồng.community forum.

Làm cách nào để tải lên một tệp với yêu cầu bài đăng?

Cách tải lên một tệp với yêu cầu HTTP - Phương thức đăng..
Tạo một quy trình làm việc. Thêm 'Viết tệp' và các hành động 'Yêu cầu HTTP' vào khung vẽ của bạn và kết nối chúng như hình dưới đây:.
Định cấu hình hành động 'Viết tệp'. Định cấu hình hành động 'Viết tệp' như được hiển thị bên dưới: ....
Định cấu hình 'HTTP Yêu cầu' hành động ..

Làm thế nào để bạn tải lên nhiều tệp trong Python?

Chạy ứng dụng bằng cách chạy của Py Python nhiềufilesupload.py. Go to browser and type “//localhost:5000”, you will see “upload files” in browser.

Làm cách nào để tải tệp lên thư mục trong Python?

Phương pháp 1: Sử dụng mô-đun HĐH của Python: Ngoài ra, thuộc tính Enctype có giá trị "đa phần/dữ liệu hình thức" sẽ giúp biểu mẫu HTML tải lên tệp.Cuối cùng, chúng tôi cần thẻ đầu vào với thuộc tính tên tệp để tải lên tệp chúng tôi muốn.Cuối cùng, chúng tôi cần thẻ đầu vào với thuộc tính tên tệp để tải lên tệp chúng tôi muốn.Using the Python's os Module: Also, the enctype attribute with "multi-part/form-data" value will help the HTML form to upload a file. Lastly, we need the input tag with the filename attribute to upload the file we want. Lastly, we need the input tag with the filename attribute to upload the file we want.

Làm thế nào để bạn gửi các tệp trong Python?

Cách tiếp cận từng bước:..
Cài đặt các phụ thuộc bằng cách sử dụng Cài đặt PIP tại dòng lệnh ..
Nhập các mô -đun cần thiết: HTTP.Máy chủ và Socketserver: Để lưu trữ trong trình duyệt.....
Gán cổng và tên của người dùng ..
Tìm địa chỉ IP của PC và chuyển đổi nó thành mã QR ..
Tạo yêu cầu HTTP ..
Hiển thị mã QR trong trình duyệt ..

Bài Viết Liên Quan

Chủ Đề