2010-10-03 1 views
0

Возможна загрузка файлов через метод PUT, даже двоичный или текстовый, с помощью «обычного веб-браузера». Почему многие люди просто говорят, что это невозможно?Загрузка файлов асинхронно (AJAX) с использованием метода HTTP/1.1 PUT, почему бы и нет?

Пример кода с jQuery и PHP.

$(document).ready(function() { 
    $("#uploadbutton").click(function() { 
     var filename = $("#file").val(); 
     $.ajax({ 
     type: "PUT", 
     url: "addFile.do", 
      enctype: 'multipart/form-data', 
      data: {file: filename}, 
      success: function(){ 
       alert("Data Uploaded: "); 
      } 
     });  
    }); 
}); 

На стороне сервера просто читать поток STDIN как

<?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); 
?> 
+2

Что вы хотите сказать? –

ответ

0

Для вашего решения конкретно, в основном потому, что PUT метод (глагол) не поддерживается всеми браузерами, особенно старые, так что решение не будет работать для всех.

The topic has come up previously as well, хотя и не совсем то же самое, некоторые ответы являются примерами того, где PUT и DELETE не работают.

The documentation for $.ajax() mentions this as well:

Тип
По умолчанию: 'GET'
тип запроса, чтобы сделать ("POST" или "GET"), по умолчанию "GET".

Примечание: Здесь также могут использоваться другие методы запроса HTTP, такие как PUT и DELETE, но они не поддерживаются всеми браузерами.

0
{file: filename} 

При загрузке файла, вы должны загрузить файл. Сообщать серверу, что локальное имя файла ... недостаточно.

JavaScript, работающий в веб-браузере в стандартном контексте безопасности, не имеет доступа к чтению данных в файле с жесткого диска пользователя.

Поскольку вы не можете получить данные, вы не можете загрузить их.

+1

Я думаю, что вы пропустили HTTP-глагол 'PUT' здесь, он * работает *, но он не так широко поддерживается, как вам нужно будет идти по этому маршруту. –

+0

Разве это не просто * второе препятствие к проблеме? – Quentin

+0

Нет, так работает 'PUT', чтобы быть на 100% правильным, это должно быть:' addFile.do/filename', но проблема в основном - поддержка ... хотя да, его текущая реализация не будет работать вне PHP, по крайней мере, не на какой-либо структуре, о которой я могу думать, пока URL-адрес не будет исправлен. Что же касается контекста вопроса, то проблема опять-таки заключается в отсутствии широкой поддержки именно подхода OPs, а не ограничений, мешающих ему полностью ... хотя, конечно, есть дюжина веских причин * не *, чтобы сделать это путь OP все равно :) –