Hướng dẫn upload binary file in php - tải lên tệp nhị phân trong php

Đã hỏi 7 năm, 8 tháng trước 7 years, 8 months ago

Đã xem 8k lần 8k times

Tôi đang tìm kiếm một cách để cho phép tải lên tệp nhưng thay vì viết tệp vào đĩa trên máy chủ web, tôi muốn lưu trữ nội dung nhị phân trong một biến. Tôi đã tìm thấy một ví dụ đơn giản để thực sự thực hiện tải lên nhưng tôi không thể tìm ra cách để ngăn chặn việc viết vào tệp và thay vào đó giữ nó trong bộ nhớ.

Có thể làm điều này và nếu vậy làm thế nào?

";

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
  echo "File is valid, and was successfully uploaded.\n";
} else {
   echo "Upload failed";
}

echo "

"; echo '
';
echo 'Here is some more debugging info:';
print_r($_FILES);
print "
"; ?>
Send this file:

Đã hỏi ngày 5 tháng 3 năm 2015 lúc 7:22Mar 5, 2015 at 7:22

Nếu bạn chỉ cần tệp đã tải lên cho thời gian chạy PHP thì

$uploadfile = file_get_contents($_FILES['userfile']['tmp_name']);

Sau này nếu bạn cần lưu trữ nó trên MySQL DB, bạn luôn có thể thực hiện 'AddSlashes ()' cho nó.

Đã trả lời ngày 5 tháng 3 năm 2015 lúc 7:42Mar 5, 2015 at 7:42

Hướng dẫn upload binary file in php - tải lên tệp nhị phân trong php

1

Ngày 31 tháng 7 năm 2012 • 12 phút Đọc 12 min read

Hướng dẫn upload binary file in php - tải lên tệp nhị phân trong php
Đây có thể là tập tin của bạn ngay tại đây.

Tôi đã làm việc trong một dự án mà tôi phải gửi và nhận các tệp nhị phân đến và từ API REST, vì vậy tôi quyết định ghi lại một số mã tôi đã viết. Hãy nhớ rằng tôi đã trích xuất tất cả các đoạn mã này từ một lớp PHP tùy chỉnh mà tôi đã viết, vì vậy nếu bạn làm việc với API, tôi sẽ khuyến khích bạn tạo một lớp của riêng bạn.

Thiết lập một biểu mẫu để gửi tệp

Trước khi bạn có thể gửi tệp nhị phân đến API, bạn phải lấy nó từ đâu đó. Trong dự án của tôi, tập tin đó đến từ một hình thức. Hình thức có thể đơn giản như thế này:

Lưu ý Thuộc tính

1 được đặt thành
2. Bạn phải có bộ này, nếu không tệp sẽ không được gửi.

Lấy tệp đã gửi

Thông thường khi bạn xử lý một biểu mẫu, nội dung được tìm thấy bên trong biến

3 toàn cầu, tuy nhiên dữ liệu tệp nằm trong biến
4 toàn cầu.

Nếu bạn in nội dung của

4 trên trang, biểu mẫu đã được gửi, bạn sẽ thấy một cái gì đó như:

Array
(
  [file] => Array
    (
      [name] => Array
        (
          [0] => 400.png
        )
      [type] => Array
        (
          [0] => image/png
        )
      [tmp_name] => Array
        (
          [0] => /tmp/php5Wx0aJ
        )
      [error] => Array
        (
          [0] => 0
        )
      [size] => Array
        (
          [0] => 15726
        )
    )
)

Điều khác thường về mảng này là thay vì nhóm mỗi dữ liệu tệp trong một mảng, mỗi thông tin về một tệp được nhóm lại với nhau. Vì vậy, các giá trị tại Index

6 trong
7,
8,
9,
Array
(
  [file] => Array
    (
      [name] => Array
        (
          [0] => 400.png
        )
      [type] => Array
        (
          [0] => image/png
        )
      [tmp_name] => Array
        (
          [0] => /tmp/php5Wx0aJ
        )
      [error] => Array
        (
          [0] => 0
        )
      [size] => Array
        (
          [0] => 15726
        )
    )
)
0 và
Array
(
  [file] => Array
    (
      [name] => Array
        (
          [0] => 400.png
        )
      [type] => Array
        (
          [0] => image/png
        )
      [tmp_name] => Array
        (
          [0] => /tmp/php5Wx0aJ
        )
      [error] => Array
        (
          [0] => 0
        )
      [size] => Array
        (
          [0] => 15726
        )
    )
)
1 thuộc về một tệp.

Dữ liệu tệp nhị phân được đặt trong một bộ lưu trữ tạm thời trên máy chủ của bạn. Trong trường hợp này, tại

Array
(
  [file] => Array
    (
      [name] => Array
        (
          [0] => 400.png
        )
      [type] => Array
        (
          [0] => image/png
        )
      [tmp_name] => Array
        (
          [0] => /tmp/php5Wx0aJ
        )
      [error] => Array
        (
          [0] => 0
        )
      [size] => Array
        (
          [0] => 15726
        )
    )
)
2.

Gửi nội dung nhị phân qua Curl

Đoạn trích sau đây gửi tệp nhị phân đến URL:

$url = 'https://example.org/api';
$header = array('Content-Type: multipart/form-data');
$fields = array('file' => '@' . $_FILES['file']['tmp_name'][0]);
$token = 'NfxoS9oGjA6MiArPtwg4aR3Cp4ygAbNA2uv6Gg4m';

$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HTTPHEADER, $header);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_POST, 1);
curl_setopt($resource, CURLOPT_POSTFIELDS, $fields);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$result = json_decode(curl_exec($resource));
curl_close($resource);

Hãy nói về từng dòng này, bởi vì một số điều này sẽ phụ thuộc vào các yêu cầu của API bạn đang sử dụng và có thể không cần thiết.

  • Array
    (
      [file] => Array
        (
          [name] => Array
            (
              [0] => 400.png
            )
          [type] => Array
            (
              [0] => image/png
            )
          [tmp_name] => Array
            (
              [0] => /tmp/php5Wx0aJ
            )
          [error] => Array
            (
              [0] => 0
            )
          [size] => Array
            (
              [0] => 15726
            )
        )
    )
    3 là nơi Curl sẽ đăng dữ liệu của bạn.
  • Array
    (
      [file] => Array
        (
          [name] => Array
            (
              [0] => 400.png
            )
          [type] => Array
            (
              [0] => image/png
            )
          [tmp_name] => Array
            (
              [0] => /tmp/php5Wx0aJ
            )
          [error] => Array
            (
              [0] => 0
            )
          [size] => Array
            (
              [0] => 15726
            )
        )
    )
    4 nói với API rằng có một tệp đang theo cách của nó. Bạn có thể cung cấp nhiều tiêu đề hơn bằng cách thêm các giá trị bổ sung vào mảng.
  • Array
    (
      [file] => Array
        (
          [name] => Array
            (
              [0] => 400.png
            )
          [type] => Array
            (
              [0] => image/png
            )
          [tmp_name] => Array
            (
              [0] => /tmp/php5Wx0aJ
            )
          [error] => Array
            (
              [0] => 0
            )
          [size] => Array
            (
              [0] => 15726
            )
        )
    )
    5 chứa một mảng kết hợp. Tên trường phụ thuộc vào những gì API mong đợi. Dấu hiệu
    Array
    (
      [file] => Array
        (
          [name] => Array
            (
              [0] => 400.png
            )
          [type] => Array
            (
              [0] => image/png
            )
          [tmp_name] => Array
            (
              [0] => /tmp/php5Wx0aJ
            )
          [error] => Array
            (
              [0] => 0
            )
          [size] => Array
            (
              [0] => 15726
            )
        )
    )
    6 trong giá trị cho Curl nói rằng chúng tôi đang xử lý một tệp.
  • Array
    (
      [file] => Array
        (
          [name] => Array
            (
              [0] => 400.png
            )
          [type] => Array
            (
              [0] => image/png
            )
          [tmp_name] => Array
            (
              [0] => /tmp/php5Wx0aJ
            )
          [error] => Array
            (
              [0] => 0
            )
          [size] => Array
            (
              [0] => 15726
            )
        )
    )
    7 là một mã thông báo mà API còn lại mong đợi như một cookie. Thông thường bạn đăng nhập vào API một lần trong một giao dịch, sau đó sử dụng mã thông báo cho tất cả các yêu cầu tiếp theo. Cookie được gọi là
    Array
    (
      [file] => Array
        (
          [name] => Array
            (
              [0] => 400.png
            )
          [type] => Array
            (
              [0] => image/png
            )
          [tmp_name] => Array
            (
              [0] => /tmp/php5Wx0aJ
            )
          [error] => Array
            (
              [0] => 0
            )
          [size] => Array
            (
              [0] => 15726
            )
        )
    )
    8, nhưng điều này có thể khác nhau tùy thuộc vào kỳ vọng của API.
  • Array
    (
      [file] => Array
        (
          [name] => Array
            (
              [0] => 400.png
            )
          [type] => Array
            (
              [0] => image/png
            )
          [tmp_name] => Array
            (
              [0] => /tmp/php5Wx0aJ
            )
          [error] => Array
            (
              [0] => 0
            )
          [size] => Array
            (
              [0] => 15726
            )
        )
    )
    9 nói với Curl chúng tôi muốn có phản hồi.
  • $url = 'https://example.org/api';
    $header = array('Content-Type: multipart/form-data');
    $fields = array('file' => '@' . $_FILES['file']['tmp_name'][0]);
    $token = 'NfxoS9oGjA6MiArPtwg4aR3Cp4ygAbNA2uv6Gg4m';
    
    $resource = curl_init();
    curl_setopt($resource, CURLOPT_URL, $url);
    curl_setopt($resource, CURLOPT_HTTPHEADER, $header);
    curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($resource, CURLOPT_POST, 1);
    curl_setopt($resource, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
    $result = json_decode(curl_exec($resource));
    curl_close($resource);
    0 cho biết Curl chúng tôi muốn dữ liệu của chúng tôi được đăng.
  • $url = 'https://example.org/api';
    $header = array('Content-Type: multipart/form-data');
    $fields = array('file' => '@' . $_FILES['file']['tmp_name'][0]);
    $token = 'NfxoS9oGjA6MiArPtwg4aR3Cp4ygAbNA2uv6Gg4m';
    
    $resource = curl_init();
    curl_setopt($resource, CURLOPT_URL, $url);
    curl_setopt($resource, CURLOPT_HTTPHEADER, $header);
    curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($resource, CURLOPT_POST, 1);
    curl_setopt($resource, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
    $result = json_decode(curl_exec($resource));
    curl_close($resource);
    1 Đặt mã thông báo làm cookie.

Cuối cùng, hãy chú ý dòng cuối cùng:

$result = json_decode(curl_exec($resource));

Trong trường hợp của tôi, tôi biết rằng phản hồi mà tôi đã nhận được từ API sẽ ở định dạng JSON, đó là lý do tại sao tôi lại giải mã nó. Ví dụ, bạn có thể không cần điều này nếu bạn nhận lại phản hồi trong XML.

Điều này hoàn thành việc gửi một tập tin nhị phân qua Curl.

Tiếp theo, chúng tôi sẽ xem xét truy xuất tập tin đó.

Lấy nội dung nhị phân thông qua Curl

Tại đây, cách lấy một tệp nhị phân:

$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HEADER, 1);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$file = curl_exec($resource);
curl_close($resource);

Chúng tôi không phải đi qua bất cứ điều gì ngoại trừ:

  • $url = 'https://example.org/api';
    $header = array('Content-Type: multipart/form-data');
    $fields = array('file' => '@' . $_FILES['file']['tmp_name'][0]);
    $token = 'NfxoS9oGjA6MiArPtwg4aR3Cp4ygAbNA2uv6Gg4m';
    
    $resource = curl_init();
    curl_setopt($resource, CURLOPT_URL, $url);
    curl_setopt($resource, CURLOPT_HTTPHEADER, $header);
    curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($resource, CURLOPT_POST, 1);
    curl_setopt($resource, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
    $result = json_decode(curl_exec($resource));
    curl_close($resource);
    2 nói với Curl rằng chúng tôi hy vọng sẽ có một tiêu đề. Điều này rất quan trọng, bởi vì nó cho chúng ta biết loại tệp nào chúng ta đang nhận được, tức là một hình ảnh, một tài liệu từ, PDF, v.v.
  • $url = 'https://example.org/api';
    $header = array('Content-Type: multipart/form-data');
    $fields = array('file' => '@' . $_FILES['file']['tmp_name'][0]);
    $token = 'NfxoS9oGjA6MiArPtwg4aR3Cp4ygAbNA2uv6Gg4m';
    
    $resource = curl_init();
    curl_setopt($resource, CURLOPT_URL, $url);
    curl_setopt($resource, CURLOPT_HTTPHEADER, $header);
    curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($resource, CURLOPT_POST, 1);
    curl_setopt($resource, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
    $result = json_decode(curl_exec($resource));
    curl_close($resource);
    3 nói với PHP rằng kết quả sẽ chứa dữ liệu nhị phân. Rất nhiều người cho rằng bạn không cần dòng này. Tôi nói hãy thử nó với và không, chỉ để chắc chắn.

Bây giờ bạn có tệp nhị phân với các tiêu đề được lưu trữ trong

$url = 'https://example.org/api';
$header = array('Content-Type: multipart/form-data');
$fields = array('file' => '@' . $_FILES['file']['tmp_name'][0]);
$token = 'NfxoS9oGjA6MiArPtwg4aR3Cp4ygAbNA2uv6Gg4m';

$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HTTPHEADER, $header);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_POST, 1);
curl_setopt($resource, CURLOPT_POSTFIELDS, $fields);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$result = json_decode(curl_exec($resource));
curl_close($resource);
4.

Đưa tệp lại cho người dùng

Hãy cùng tiếp tục về cách cung cấp lại tệp cho người dùng. Bạn có thể lưu trữ tệp trên máy chủ và cung cấp cho người dùng một URL vào tệp hoặc bạn chỉ có thể để PHP xử lý tất cả những thứ đó một cách nhanh chóng và chỉ cần nhắc người dùng lưu tệp.

Đây là cách tôi đã làm điều đó:

$file_array = explode("\n\r", $file, 2);
$header_array = explode("\n", $file_array[0]);
foreach($header_array as $header_value) {
  $header_pieces = explode(':', $header_value);
  if(count($header_pieces) == 2) {
    $headers[$header_pieces[0]] = trim($header_pieces[1]);
  }
}
header('Content-type: ' . $headers['Content-Type']);
header('Content-Disposition: ' . $headers['Content-Disposition']);
echo substr($file_array[1], 1);
  • Trên dòng 1, tôi tách tiêu đề khỏi phần còn lại của tệp.line 1 I separate the header from the rest of the file.
  • Trên dòng 2-8 Tôi phân tích nội dung tiêu đề và đặt chúng vào một mảng để tôi có thể dễ dàng tham khảo các yếu tố tôi cần.line 2-8 I parse the header contents and put them in an array so I can easily reference the elements I need.
  • Trên dòng 9 & 10 Tôi nói với PHP loại nội dung là gì và tệp nên được gọi là gì.line 9 & 10 I tell PHP what the content type is and what the file should be called.
  • Trên dòng 11 Tôi xuất ra tất cả các nội dung nhị phân. Cùng với tiêu đề, nó nhắc người dùng lưu tệp (hoặc hiển thị nó trong trình duyệt nếu nó là một hình ảnh, chẳng hạn).line 11 I output all of the binary contents. Together with the header, it prompts the user to save the file (or displays it in the browser if it’s an image, for example).

Tôi muốn chạm vào hàm trên dòng 11:

$url = 'https://example.org/api';
$header = array('Content-Type: multipart/form-data');
$fields = array('file' => '@' . $_FILES['file']['tmp_name'][0]);
$token = 'NfxoS9oGjA6MiArPtwg4aR3Cp4ygAbNA2uv6Gg4m';

$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HTTPHEADER, $header);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_POST, 1);
curl_setopt($resource, CURLOPT_POSTFIELDS, $fields);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$result = json_decode(curl_exec($resource));
curl_close($resource);
5

Trong trường hợp của tôi, tệp nhị phân có thêm không gian ở đầu tệp. Hàm

$url = 'https://example.org/api';
$header = array('Content-Type: multipart/form-data');
$fields = array('file' => '@' . $_FILES['file']['tmp_name'][0]);
$token = 'NfxoS9oGjA6MiArPtwg4aR3Cp4ygAbNA2uv6Gg4m';

$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HTTPHEADER, $header);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_POST, 1);
curl_setopt($resource, CURLOPT_POSTFIELDS, $fields);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$result = json_decode(curl_exec($resource));
curl_close($resource);
6 loại bỏ điều đó. Tôi không chắc chắn liệu không gian đó đến từ API hay từ
$url = 'https://example.org/api';
$header = array('Content-Type: multipart/form-data');
$fields = array('file' => '@' . $_FILES['file']['tmp_name'][0]);
$token = 'NfxoS9oGjA6MiArPtwg4aR3Cp4ygAbNA2uv6Gg4m';

$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HTTPHEADER, $header);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_POST, 1);
curl_setopt($resource, CURLOPT_POSTFIELDS, $fields);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$result = json_decode(curl_exec($resource));
curl_close($resource);
7 trên dòng 1, vì vậy nếu điều này không hoạt động cho bạn, hãy thử thay đổi dòng đó thành:
$url = 'https://example.org/api';
$header = array('Content-Type: multipart/form-data');
$fields = array('file' => '@' . $_FILES['file']['tmp_name'][0]);
$token = 'NfxoS9oGjA6MiArPtwg4aR3Cp4ygAbNA2uv6Gg4m';

$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HTTPHEADER, $header);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_POST, 1);
curl_setopt($resource, CURLOPT_POSTFIELDS, $fields);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$result = json_decode(curl_exec($resource));
curl_close($resource);
8

Hy vọng rằng thông tin này sẽ làm sáng tỏ cách đăng và truy xuất các tệp ở định dạng nhị phân. Nếu bạn có bất kỳ câu hỏi, hãy để chúng trong một bình luận dưới đây.

Hình ảnh nổi bật của Alexander Sinn.


Trước đây được đăng trong WordPress và chuyển sang Ghost.

Maheshmay 14, 2013 lúc 6:28 sáng
May 14, 2013 at 6:28 am

Xin chào ,

Tôi muốn tìm nạp một hình ảnh bằng API Curl và muốn hiển thị trực tiếp trong hộp ưa thích, nhưng nó luôn hiển thị ở định dạng nhị phân. Ngay cả tôi đã thêm tiêu đề ở đó.

Mã tương tự đang hoạt động nếu tôi không sử dụng FancyBox.

Bạn có thể giúp tôi không.

Ryan Sechrestmay 23, 2013 lúc 7:53 tối Sechrest
May 23, 2013 at 7:53 pm

Bạn đã thử lưu trữ hình ảnh trong một tệp tạm thời, để bạn có thể nhúng nó vào hộp ưa thích chưa?

Devmay 31, 2013 lúc 1:16 chiều
May 31, 2013 at 1:16 pm

Xin chào, bạn có thể gợi ý cho tôi về cách tôi có thể xác minh rằng tệp của tôi được tải lên chính xác lên máy chủ không? 1) Tôi có thể gửi một số loại tổng kiểm tra tệp đến máy chủ bằng Curl không? để máy chủ cũng tính toán tổng kiểm tra trên tệp đã nhận và so sánh hai tổng kiểm tra và trả lời với mã phản hồi thích hợp.
Can you suggest me on how can I verify that my file is uploaded correctly to the server?
1) Can I send some kind of file checksum to the server using CURL? so that the server also calculates the checksum on received file and compares two checksums and reply with proper response code.

Làm thế nào để làm điều đó trong Curl?

Ryan Sechrestmay 31, 2013 lúc 2:25 chiều Sechrest
May 31, 2013 at 2:25 pm

Bạn có thể tạo một tập lệnh trên máy chủ mong đợi hai giá trị: tổng kiểm tra và tên tệp. Sau đó, bạn có thể đăng hai giá trị đó bằng cách sử dụng Curl. Sau đó, máy chủ sẽ tính toán tổng kiểm tra của tệp hiện có và so sánh nó với những gì bạn đã gửi. Nếu nó phù hợp, bạn có thể trả về một cái gì đó như
$url = 'https://example.org/api';
$header = array('Content-Type: multipart/form-data');
$fields = array('file' => '@' . $_FILES['file']['tmp_name'][0]);
$token = 'NfxoS9oGjA6MiArPtwg4aR3Cp4ygAbNA2uv6Gg4m';

$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HTTPHEADER, $header);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_POST, 1);
curl_setopt($resource, CURLOPT_POSTFIELDS, $fields);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$result = json_decode(curl_exec($resource));
curl_close($resource);
9 và nếu nó không, bạn có thể trả lại
$result = json_decode(curl_exec($resource));
0 (và tùy chọn xóa tệp). Vì vậy, yêu cầu đầu tiên tải lên tệp và yêu cầu thứ hai xác minh nó.

Bharat Masimukkudecember 20 tháng 12 năm 2013 lúc 2:22 sáng
December 20, 2013 at 2:22 am

Xin chào ryan

Tôi có yêu cầu sau đây. Tải lên hình ảnh định dạng JPG lên máy chủ jpegmini và nhận hình ảnh nén dưới dạng phản hồi.

Vui lòng tham khảo tài liệu JPEGMini dưới đây:

Phương pháp:

$result = json_decode(curl_exec($resource));
1

URL:

$result = json_decode(curl_exec($resource));
2

Cơ thể: Dữ liệu của ảnh JPEG nguồn

Lệnh:

$result = json_decode(curl_exec($resource));
3

Nếu chúng ta phá vỡ lệnh trên:

$result = json_decode(curl_exec($resource));
4 - Chỉ định phương thức bài HTTP

$result = json_decode(curl_exec($resource));
5 - Chỉ định nội dung cơ thể là JPEG

$result = json_decode(curl_exec($resource));
6 - Gửi
$result = json_decode(curl_exec($resource));
7 làm dữ liệu của yêu cầu

$result = json_decode(curl_exec($resource));
8 - Lưu trữ phản hồi trong
$result = json_decode(curl_exec($resource));
9 (thay vì stdout)

Xin lưu ý rằng URL JPEGMini là một ví dụ AWS. Tôi đang dừng trường hợp khi không sử dụng nó. Nếu bạn muốn tôi chạy trường hợp, xin vui lòng cho tôi biết.

Tôi muốn thực hiện yêu cầu Curl này và nhận phản hồi bằng PHP.

Hãy giúp tôi ra.

Ryan Sechrestdecember 20 tháng 12 năm 2013 lúc 4:26 chiều
December 20, 2013 at 4:26 pm

Bạn đã thử lệnh Curl của mình thông qua dòng lệnh và nó có cung cấp cho bạn phản hồi mà bạn đang tìm kiếm không? Nếu vậy, bạn đã thử chuyển đổi nó thành PHP và không thành công? Nếu vậy, hãy đăng mã PHP bạn đã thử trong một ý chính để tôi có thể xem nó.

Manishmarch 11, 2014 lúc 9:00 sáng
March 11, 2014 at 9:00 am

Hello,

Khi bạn xác định trong blog của mình, tôi có cùng các bước trên để tải lên và tải xuống các tệp bằng Curl, nhưng nó không hoạt động nữa. Bạn có thể xác định bằng các ví dụ. Vì vậy, tôi có thể hiểu dễ dàng.

Cảm ơn trong Arora Advancemanish
Manish Arora

Ryan Sechrestmarch 11, 2014 lúc 9:09 sáng
March 11, 2014 at 9:09 am

Tôi sẽ cần thêm một chút thông tin. Những gì cụ thể là làm việc và bạn đang nhận được phản hồi nào? Khi bạn nói rằng nó không hoạt động nữa, nó có hoạt động cho bạn trước đây không?

Manishmarch 12, 2014 lúc 2:57 sáng
March 12, 2014 at 2:57 am

Xin chào ryan,

Tôi sử dụng mã của bạn và như bạn nói rằng tải xuống Popup sẽ hiển thị trên trình duyệt khách, nhưng nó không hiển thị và chỉ hiển thị nội dung của tệp.

Vì vậy, làm thế nào để tải xuống tập tin, vui lòng mô tả nó ở đây.

Cảm ơn trong sự tiến bộ
Manish

Ryan Sechrestmarch 12, 2014 lúc 9:13 sáng
March 12, 2014 at 9:13 am

Đầu tiên, tôi sẽ lặp lại
$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HEADER, 1);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$file = curl_exec($resource);
curl_close($resource);
0 và
$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HEADER, 1);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$file = curl_exec($resource);
curl_close($resource);
1 để đảm bảo những điều đó là đúng. Thứ hai, bạn đã thử lặp lại
$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HEADER, 1);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$file = curl_exec($resource);
curl_close($resource);
2 mà không cần sử dụng
$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HEADER, 1);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$file = curl_exec($resource);
curl_close($resource);
3 chưa? Thứ ba, để thử nghiệm, hãy lưu tệp vào đĩa, tải xuống và sau đó mở nó để xác minh tệp được truyền lại cho bạn đúng cách.

PHPDeveloperMay 7, 2014 lúc 10:16 sáng
May 7, 2014 at 10:16 am

Ryan,

Cảm ơn về bài đăng hữu ích. Tôi đã đập đầu vào vấn đề này khi tải lên một biểu mẫu bằng tệp bằng cách sử dụng Curl nhưng chỉ đơn giản là có thể tìm ra những gì sai với mã của tôi.

Đây là mã của tôi:

$cfile = new CURLFile('/home/xyz/myimge.jpg', 'image/jpeg', 'mymage.jpg');
      
$params = array(
  "userid_id" => "some id #",
  "file" => $cfile,
  "name" => "test_file",
  "gallery" => "myalbum"
);
     
$uri = 'http://myserver.com/somedir/';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $uri);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); 
curl_setopt($ch, CURLOPT_POST, true );
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
       
$response_data = curl_exec($ch);
     
var_dump(curl_getinfo($ch));
        
var_dump($response_data);
curl_close( $ch );
unset( $ch );
Nhưng khi tôi thấy đầu ra của mình từ
$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HEADER, 1);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$file = curl_exec($resource);
curl_close($resource);
4, tôi thấy loại nội dung đó vẫn là
$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HEADER, 1);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$file = curl_exec($resource);
curl_close($resource);
5, trong đó tất cả các tài liệu tôi đã thấy cho thấy rằng, một khi bạn thêm một tệp vào trường sau, Curl sẽ tự động chuyển đổi loại nội dung thành
2. Tôi nhận được dữ liệu biểu mẫu khác nhưng không nhận được dữ liệu tệp nơi tôi đang đăng dữ liệu của mình.

Không chắc tôi đang làm gì sai ở đây. Bất kỳ ý tưởng?

Tôi đang ở trên Php 5.5, vì vậy việc thêm

Array
(
  [file] => Array
    (
      [name] => Array
        (
          [0] => 400.png
        )
      [type] => Array
        (
          [0] => image/png
        )
      [tmp_name] => Array
        (
          [0] => /tmp/php5Wx0aJ
        )
      [error] => Array
        (
          [0] => 0
        )
      [size] => Array
        (
          [0] => 15726
        )
    )
)
6 vào đường dẫn tệp không hoạt động, vì nó không được chấp nhận.

Ryan Sechrestmay 7, 2014 lúc 11:59 sáng
May 7, 2014 at 11:59 am

@phpdeveloper

Tôi đã không sử dụng lớp Curlfile, nhưng cú pháp của bạn trông đúng.

Hãy thử đặt thủ công tiêu đề thành

2 bằng tùy chọn
$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_HEADER, 1);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($resource, CURLOPT_COOKIE, 'apiToken=' . $token);
$file = curl_exec($resource);
curl_close($resource);
9:

$header = array('Content-Type: multipart/form-data');
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
Ngoài ra, liên quan đến việc bạn không nhận được tệp, bạn đã kiểm tra
4 và nó trống?

PHPDeveloperMay 7, 2014 lúc 1:22 chiều
May 7, 2014 at 1:22 pm

Ryan,

Tôi đã thử cài đặt thủ công Content_Type thành Multipart/Form dữ liệu nhưng nó không có tác dụng.

Như thế này:

$uploadfile = file_get_contents($_FILES['userfile']['tmp_name']);
0
Vâng,
4 là trống.

Ryan Sechrestmay 7, 2014 lúc 5:04 chiều
May 7, 2014 at 5:04 pm

OK, vì vậy tôi đã thiết lập một môi trường cục bộ, chạy PHP 5.5.12 và Curl 7.19.7, thiết lập thử nghiệm sau:
$uploadfile = file_get_contents($_FILES['userfile']['tmp_name']);
1
Trong đó
$file_array = explode("\n\r", $file, 2);
$header_array = explode("\n", $file_array[0]);
foreach($header_array as $header_value) {
  $header_pieces = explode(':', $header_value);
  if(count($header_pieces) == 2) {
    $headers[$header_pieces[0]] = trim($header_pieces[1]);
  }
}
header('Content-type: ' . $headers['Content-Type']);
header('Content-Disposition: ' . $headers['Content-Disposition']);
echo substr($file_array[1], 1);
2 chứa những điều sau:
$uploadfile = file_get_contents($_FILES['userfile']['tmp_name']);
2
Và tôi đã nhận được đầu ra sau:
$uploadfile = file_get_contents($_FILES['userfile']['tmp_name']);
3
Hãy thử mã và xem bạn có nhận được kết quả khác không. Nếu điều này không hoạt động, hãy đảm bảo các quyền hình ảnh là chính xác, hãy thử một hình ảnh khác (có lẽ nhỏ hơn) và đảm bảo PHP có thể ghi vào thư mục
$file_array = explode("\n\r", $file, 2);
$header_array = explode("\n", $file_array[0]);
foreach($header_array as $header_value) {
  $header_pieces = explode(':', $header_value);
  if(count($header_pieces) == 2) {
    $headers[$header_pieces[0]] = trim($header_pieces[1]);
  }
}
header('Content-type: ' . $headers['Content-Type']);
header('Content-Disposition: ' . $headers['Content-Disposition']);
echo substr($file_array[1], 1);
3. Tôi về cơ bản nghĩ rằng nó có một cái gì đó khác với mã của bạn.

Tái bút: Tôi nhận thấy

$file_array = explode("\n\r", $file, 2);
$header_array = explode("\n", $file_array[0]);
foreach($header_array as $header_value) {
  $header_pieces = explode(':', $header_value);
  if(count($header_pieces) == 2) {
    $headers[$header_pieces[0]] = trim($header_pieces[1]);
  }
}
header('Content-type: ' . $headers['Content-Type']);
header('Content-Disposition: ' . $headers['Content-Disposition']);
echo substr($file_array[1], 1);
4 đã bị sai chính tả, vì vậy hãy chắc chắn rằng có một tệp theo tên đó (thiếu chữ cái ‘một hình ảnh trong hình ảnh).

PHPDeveloperMay 8, 2014 lúc 9:55 sáng
May 8, 2014 at 9:55 am

Ryan,

Cảm ơn bạn đã giúp đỡ.

Mã của bạn trông giống như của tôi và Yetl Tôi nhận được kết quả khác nhau. Tôi tự hỏi nếu nó có liên quan đến khung tôi đang sử dụng. Tôi đang sử dụng Kohana 3.3 và nắm bắt đối tượng yêu cầu trong API của mình để lấy các biến bài đăng. Tôi sẽ xem nếu có một số vấn đề trên mặt trận đó. Xin vui lòng cho tôi biết nếu bạn có bất kỳ kinh nghiệm nào với Kohana.

PHPDeveloperMay 8, 2014 lúc 11:44 sáng
May 8, 2014 at 11:44 am

Ryan,

Tôi bắt đầu từ đầu, xóa tất cả mã của mình. Sau đó sao chép mã của bạn và kiểm tra nó, và nó đã hoạt động.

Có vẻ như tôi đã có một cái gì đó trong mã khiến nó không hoạt động đúng. Không chắc nó là gì mặc dù. Cảm ơn rất nhiều cho sự giúp đỡ của bạn.
Thanks a lot for your help.

Ryan Sechrestmay 8, 2014 lúc 11:49 sáng
May 8, 2014 at 11:49 am

Tuyệt vời, rất vui khi nghe (trừ phần mà chúng tôi không biết những gì thực sự gây ra vấn đề).

Brian Andersondecember tháng 1 năm 2014 lúc 4:50 chiều
December 14, 2014 at 4:50 pm

Ryan, tôi hy vọng bạn vẫn đang theo dõi chủ đề này. Cảm ơn bạn trước vì đã xem xét điều này! Tôi cảm thấy khá ngu ngốc về điều này và sẵn sàng trả tiền cho người khác thông minh về một thỏa thuận tư vấn.
I hope you’re still monitoring this thread.
Thank you in advance for reviewing this!
I’m feeling pretty stupid about this and am willing to pay for somebody else’s smarts on a consulting deal.

Tôi đang cố gắng viết một máy thu cho dòng lệnh Curl sau:

$file_array = explode("\n\r", $file, 2);
$header_array = explode("\n", $file_array[0]);
foreach($header_array as $header_value) {
  $header_pieces = explode(':', $header_value);
  if(count($header_pieces) == 2) {
    $headers[$header_pieces[0]] = trim($header_pieces[1]);
  }
}
header('Content-type: ' . $headers['Content-Type']);
header('Content-Disposition: ' . $headers['Content-Disposition']);
echo substr($file_array[1], 1);
5

Đây là mã người gửi của tôi

$uploadfile = file_get_contents($_FILES['userfile']['tmp_name']);
4
Đây là mã nhận của tôi:
$uploadfile = file_get_contents($_FILES['userfile']['tmp_name']);
5
Các biến của tôi được trả về là:
$uploadfile = file_get_contents($_FILES['userfile']['tmp_name']);
6

Ryan Sechrestdecember tháng 15 năm 2014 lúc 3:08 sáng
December 15, 2014 at 3:08 am

Chao Brian,

Bạn có thể mô tả những gì bạn đang cố gắng thực hiện và vấn đề nào bạn đang gặp phải không?

Ikramapril 3, 2015 lúc 2:23 chiều
April 3, 2015 at 2:23 pm

Chào Ryan,

Tôi đang cố gắng sử dụng phương thức PUT để gửi 2 tệp đến API REST. Tôi đang sử dụng mã sau:

$uploadfile = file_get_contents($_FILES['userfile']['tmp_name']);
7
Máy chủ đang tạo lỗi.
$uploadfile = file_get_contents($_FILES['userfile']['tmp_name']);
8
Xin vui lòng, hướng dẫn

Jignesh Borichajune 17, 2015 lúc 9:14 sáng
June 17, 2015 at 9:14 am

Chào Ryan,

Tôi đang cố gắng sử dụng phương thức PUT để gửi 2 tệp đến API REST. Tôi đang sử dụng mã sau:

Máy chủ đang tạo lỗi.
Thank you

Xin vui lòng, hướng dẫn
September 14, 2015 at 8:58 pm

Jignesh Borichajune 17, 2015 lúc 9:14 sáng

Cảm ơn bạn đã giải thích ngắn gọn của bạn. Nó đã cứu ngày của tôi. Các đồng đội của tôi đã có rất nhiều vấn đề nhưng bài đăng của bạn mà tôi đã thấy đã cứu họ rất nhiều. Chúng tôi rất biết ơn bạn.
February 8, 2018 at 12:25 am

Trân trọng. Cảm ơn bạn

Daisyseptember ngày 14 tháng 12 năm 2015 lúc 8:58 tối

Cảm ơn rất nhiều. Bạn thật tuyệt vời. Nó hoạt động như mong đợi.
But it’s not work in ” PUT ”

$uploadfile = file_get_contents($_FILES['userfile']['tmp_name']);
9
HITESHFEBRIMER THÁNG 8, 2018 lúc 12:25 sáng
How to send file in HTTP ” PUT” method
and How to to get it on server side.

Hii thưa ông

Cần giúp tôi
August 27, 2019 at 1:05 pm

Trong việc gửi tệp thành công trong http post post yêu cầu, nó không hoạt động trong phạm vi

Bạn có thể cho tôi biết để gửi tệp trong phương thức HTTP, đặt phương thức và cách để có được nó ở phía máy chủ.
April 22, 2020 at 12:02 pm

Cảm ơn bạn

Vijaysinh Parmaraugust 27, 2019 lúc 1:05 chiều
April 22, 2020 at 12:05 pm

Tôi đang cố gắng tạo mã để tải xuống tệp thành trình duyệt, dữ liệu của tôi ở DB được tải lên dưới dạng tệp nhị phân bằng cách sử dụng chức năng tải lên .. Tôi có thể tải xuống các tệp như
$file_array = explode("\n\r", $file, 2);
$header_array = explode("\n", $file_array[0]);
foreach($header_array as $header_value) {
  $header_pieces = explode(':', $header_value);
  if(count($header_pieces) == 2) {
    $headers[$header_pieces[0]] = trim($header_pieces[1]);
  }
}
header('Content-type: ' . $headers['Content-Type']);
header('Content-Disposition: ' . $headers['Content-Disposition']);
echo substr($file_array[1], 1);
6,
$file_array = explode("\n\r", $file, 2);
$header_array = explode("\n", $file_array[0]);
foreach($header_array as $header_value) {
  $header_pieces = explode(':', $header_value);
  if(count($header_pieces) == 2) {
    $headers[$header_pieces[0]] = trim($header_pieces[1]);
  }
}
header('Content-type: ' . $headers['Content-Type']);
header('Content-Disposition: ' . $headers['Content-Disposition']);
echo substr($file_array[1], 1);
7,
$file_array = explode("\n\r", $file, 2);
$header_array = explode("\n", $file_array[0]);
foreach($header_array as $header_value) {
  $header_pieces = explode(':', $header_value);
  if(count($header_pieces) == 2) {
    $headers[$header_pieces[0]] = trim($header_pieces[1]);
  }
}
header('Content-type: ' . $headers['Content-Type']);
header('Content-Disposition: ' . $headers['Content-Disposition']);
echo substr($file_array[1], 1);
8 nhưng các tệp hình ảnh không mở sau khi tải xuống .. có thể bất kỳ ai xin vui lòng giúp đỡ?

Viper503April 22, 2020 lúc 12:02 tối
May 10, 2020 at 4:16 am

Cảm ơn bạn rất nhiều người đàn ông, tùy chọn chuyển nhị phân đã bị thiếu trong mã của tôi và điều đó khiến tôi bị mắc kẹt trong khoảng 3 giờ cho đến khi tôi đến đây. Cuối cùng tôi đã kết nối với API của mình và thành công nhận được phản hồi, tôi không có lời để cảm ơn bạn. Lời chào hỏi!
0
Ryan Sechrestapril 22, 2020 lúc 12:05 tối

PHP có thể phục vụ nội dung nhị phân?

Cùng một tập lệnh PHP không thể gửi đến trình duyệt cả HTML và dữ liệu nhị phân. Do đó, điều rất quan trọng là tập lệnh này không xuất bất cứ thứ gì vào trình duyệt ngoại trừ dữ liệu đó: không HTML, không có văn bản thuần túy, thậm chí không phải là một khoảng trống.. Thus, it's very important that this script does not output anything to the browser except for that data: no HTML, no plain text, not even an empty space.

Làm thế nào có thể tạo tệp tải lên trong PHP?

Tải lên tệp PHP..
Định cấu hình tệp "php.ini".Đầu tiên, đảm bảo rằng PHP được cấu hình để cho phép tải lên tệp.....
Kiểm tra nếu tệp đã tồn tại.Bây giờ chúng ta có thể thêm một số hạn chế.....
Giới hạn kích thước tệp.Trường đầu vào tệp trong biểu mẫu HTML của chúng tôi ở trên được đặt tên là "Filetoupload".....
Giới hạn loại tệp.....
Hoàn thành Tải lên Tập lệnh Php ..

Các tệp $ _ trong PHP là gì?

PHP $ _FILES Biến được xác định trước toàn cầu $ _Files là một mảng kết hợp có chứa các mục được tải lên qua phương thức bài HTTP.Tải lên một tệp yêu cầu biểu mẫu phương thức bài HTTP với thuộc tính Enctype được đặt thành nhiều dữ liệu/hình thức.an associative array containing items uploaded via HTTP POST method. Uploading a file requires HTTP POST method form with enctype attribute set to multipart/form-data.

TMP_NAME trong Tải lên tệp PHP là gì?

TMP_NAME là tên tạm thời của tệp được tải lên được tạo tự động bởi PHP và được lưu trữ trên thư mục tạm thời trên máy chủ.Tên là tên gốc của tệp là lưu trữ trên máy cục bộ.the temporary name of the uploaded file which is generated automatically by php, and stored on the temporary folder on the server. name is the original name of the file which is store on the local machine.