PHP.mk документација

Поддршка за PUT метод

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

features.file-upload.put-method.php PHP.net прокси Преводот е вчитан
Оригинал на PHP.net
Патека features.file-upload.put-method.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + преведен приказ Кодовите, табелите и белешките остануваат читливи во истиот тек.
Поддршка за PUT метод

Референца за `features.file-upload.put-method.php` со подобрена типографија и навигација.

features.file-upload.put-method.php

Поддршка за PUT метод

PHP обезбедува поддршка за HTTP PUT методот што го користат некои клиенти за складирање датотеки на сервер. PUT барањата се многу поедноставни од поставување датотека со POST барања и тие изгледаат вака:

PUT /path/filename.html HTTP/1.1

PHP обезбедува поддршка за HTTP PUT методот што го користат некои клиенти за складирање датотеки на сервер. PUT барањата се многу поедноставни од прикачување датотека со POST барања и тие изгледаат вака: /path/filename.html Ова нормално би значело дека далечинскиот клиент би сакал да ја зачува содржината што следи како: во вашето веб дрво. Очигледно не е добра идеја Apache или PHP автоматски да им дозволат на сите да презапишуваат какви било датотеки во вашето веб дрво. Значи, за да обработите такво барање, прво мора да му кажете на вашиот веб сервер дека сакате одреден PHP скрипт да го обработи барањето. Во Apache ова го правите со Script <Directory> директива. Таа може да се постави речиси насекаде во вашата конфигурациска датотека на Apache. Вообичаено место е внатре во <VirtualHost> блок или можеби внатре во

Script PUT /put.php

блок. Ред како овој би ја завршил работата: put.php Ова му кажува на Apache да испрати сите PUT барања за URI што одговараат на контекстот во кој сте го ставиле овој ред до .php скрипт. Ова претпоставува, се разбира, дека имате овозможено PHP за

extension и PHP е активен. Ресурсот за дестинација за сите PUT барања до овој скрипт мора да биде самиот скрипт, а не името на датотеката што треба да ја има прикачената датотека. myputfile.ext Со PHP, тогаш би направиле нешто слично на следното во вашиот put.php. Ова би ги копирало содржините на прикачената датотека во датотеката

на серверот. Веројатно би сакале да извршите некои проверки и/или да го автентицирате корисникот пред да извршите копирање на датотеката.

<?php
/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");

/* Open a file for writing */
$fp = fopen("myputfile.ext", "w");

/* Read the data 1 KB at a time
and write to the file */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);

/* Close the streams */
fclose($fp);
fclose($putdata);
?>

Белешки од корисници 6 белешки

Пример #1 Зачувување HTTP PUT датотеки
пред 2 години
We resolved our problem with https://pecl.php.net/package/apfd.

It parses multipart/form-data body (files and payload) with PUT and PATCH http requests, witch was only possible before with POST http request.
arnaud at caramia dot Fr
пред 15 години
Hello PHP World After many Hours of worryness :=)

I have found the Solution for Resume or Pause Uploads
In this Code Snippet it is the Server Side not Client on any Desktop Programm you must use byte ranges to calculate the uploaded bytes and missing of total bytes.

Here the PHP Code

<?php
$CHUNK = 8192;

        try {
            if (!($putData = fopen("php://input", "r")))
                throw new Exception("Can't get PUT data.");

            // now the params can be used like any other variable
            // see below after input has finished

            $tot_write = 0;
            $tmpFileName = "/var/dev/tmp/PUT_FILE";
            // Create a temp file
            if (!is_file($tmpFileName)) {
                fclose(fopen($tmpFileName, "x")); //create the file and close it
                // Open the file for writing
                if (!($fp = fopen($tmpFileName, "w")))
                    throw new Exception("Can't write to tmp file");

                // Read the data a chunk at a time and write to the file
                while ($data = fread($putData, $CHUNK)) {
                    $chunk_read = strlen($data);
                    if (($block_write = fwrite($fp, $data)) != $chunk_read)
                        throw new Exception("Can't write more to tmp file");

                    $tot_write += $block_write;
                }

                if (!fclose($fp))
                    throw new Exception("Can't close tmp file");

                unset($putData);
            } else {
                // Open the file for writing
                if (!($fp = fopen($tmpFileName, "a")))
                    throw new Exception("Can't write to tmp file");

                // Read the data a chunk at a time and write to the file
                while ($data = fread($putData, $CHUNK)) {
                    $chunk_read = strlen($data);
                    if (($block_write = fwrite($fp, $data)) != $chunk_read)
                        throw new Exception("Can't write more to tmp file");

                    $tot_write += $block_write;
                }

                if (!fclose($fp))
                    throw new Exception("Can't close tmp file");

                unset($putData);
            }

            // Check file length and MD5
            if ($tot_write != $file_size)
                throw new Exception("Wrong file size");

            $md5_arr = explode(' ', exec("md5sum $tmpFileName"));
            $md5 = $md5sum_arr[0];
            if ($md5 != $md5sum)
                throw new Exception("Wrong md5");
        } catch (Exception $e) {
            echo '', $e->getMessage(), "\n";
        }
?>
guy dot sartorelli на silverstripe точка com
пред 2 години
I was confused with file uploads using the PUT method.
My concern was why can't we upload multiple files using the PUT method with streams
PUT data comes in on the stdin stream
$putdata = fopen("php://input", "r");
Note the $putdata is a file pointer to the file content that is being uploaded.
The data is received on the server on the fly (which means available as it is received)

Secondly, when we are using parse_str(file_get_contents("php://input")).
This means the data is completely received on the server end and is then made available to the script.

When using fopen() one cant parse the data. This can be used when uploading a large file.
The file may range from 100's of MBs to Gigs where streams plays a major role.

Streams make the file data available to script in chunks instead of first saving in the temp folder.
Hence, when using $putdata = fopen("php://input", "r"); one can't pass the payload as well.
If someone wants to pass the payload the only option is in the URL query string.
micronix at gmx dot net
пред 4 години
This is what worked for me. There are many examples in the web that don't work. I found in https://lornajane.net/posts/2009/putting-data-fields-with-php-curl.

IMPORTANT: You should not use the code

       curl_setopt($ch, CURLOPT_PUT, true);

even if it seems to be the right option (it would be the right option for a POST request, with CURLOPT_POST, but it does not work for a PUT request).

Notice that the constant CURLOPT_CUSTOMREQUEST is used instead of CURLOPT_PUT, and that the value used is "PUT" instead of true.

<?php

        $url = "....."; // put your URL here

        $data = array("a" => $a);

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

        $response = curl_exec($ch);
        if ( ! $response) {
            return false;
        }
Oscar Fernandez Sierra
12 години пред
Instead of using fread fwrite to save uploaded content to a file.
stream_copy_to_stream is much cleaner.
San
пред 4 години
All the example code I found for using PUT with PHP always used a default hard-coded file extension for the incoming stream.

The filename from the incoming file PUT request can't be found anywhere from the incoming request (at least I couldn't find it) but mimetype can be found in the $_SERVER global variable.

I used this code to get the correct file extension:

$mimeType = $_SERVER['HTTP_CONTENT_TYPE'];

if ($mimeType!='application/pdf') 
    {   
    header('HTTP/1.1 405 Only PDF files allowed');
    echo("Only PDF files are allowed for upload - this file is ".$mimeType);
    die();
    }
else $fileExtension = 'pdf';

If you have an Apache Tika server available, that would be the best option to analyze the file content to get the mimetype, but that might not be in scope for everyone :-)
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.