@stationfuk

Как сделать upload файла по ссылке средствами JS / jQuery?

Есть две ссылки: одна - на файл на нашем сервере (например, "/images/image.jpg", другая - адрес загрузки на внешнем сервере (например, "target.site/upload"). Необходимо просто загрузить файл на сервер.

Вроде бы ничего сложного, но я слышал про upload файлов в JS только через формы. Необходимо ли скачать этот файл, создать скрытую форму и только потом отправить её, или есть более простой выход?
$.ajax({
    url: 'http://target.site/upload',
    type: 'POST',
    data: {
        photo: ???
    }
});


p.s.: насколько я понимаю, для этого обычно используют PHP, однако использовать его желания особого нет, т.к. на хостинге требуется строго PHP 4, да и я не умею в отладку PHP, а найденное решение не работает.

UPD: возможно, я неправильно выразился. Я хочу понять, возможно ли заменить вот этот код на PHP некоторым кодом на JS.
  • Вопрос задан
  • 1076 просмотров
Пригласить эксперта
Ответы на вопрос 3
@imhuman
А target.site ваш? Если да, то все просто, отправляем ему ссылку на ваш файл, можно даже вашим способом, только надо настроить кросс-доменные запросы. И в PHP скрипте используем элементарные file_get_contents и file_put_contents. Знаний php особо не надо, если без проверок, то всего одна строчка. Если target.site не ваш, то никак по-честному не зальете.
Ответ написан
Deonisius
@Deonisius
Родился в 11110110111 году, 11000 января.
Покажу весь код полностью, дабы вы могли его сразу протестировать. Сохраните его в html-файл:
Код HTML + JS
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Загрузка файла по URL</title>
<style type="text/css">
@import url('//netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap.min.css');
body {
  padding: 20px;
}
</style>
<script src="../js/jquery-2.1.4.min.js"></script>
</head>

<body>
<form class="form-horizontal" id="img2b64">
  <h2>Input</h2>
  <div class="form-group">
    <label class="col-sm-2 control-label">Convert via:</label>
    <div class="col-sm-10">
      <select class="form-control" name="convertType">
        <option value="Canvas" selected>Canvas</option>
        <option value="FileReader">FileReader</option>
      </select>
    </div>
  </div>
  <div class="form-group">
    <label class="col-sm-2 control-label">URL:</label>
    <div class="col-sm-10">
      <input type="url" name="url" class="form-control" placeholder="Insert an IMAGE-URL" value="http://upload.wikimedia.org/wikipedia/commons/4/4a/Logo_2013_Google.png" required />
    </div>
  </div>
  <div class="form-group">
    <div class="col-sm-offset-2 col-sm-10">
      <input type="submit" class="btn btn-default">
    </div>
  </div>
</form>
<div class="output form-horizontal" style="display: none">
  <hr>
  <h2>Output</h2>
  <div> <strong class="col-sm-2 text-right">Converted via:</strong>
    <div class="col-sm-10"> <span class="convertType"></span> </div>
  </div>
  <div> <strong class="col-sm-2 text-right">Size:</strong>
    <div class="col-sm-10"> <span class="size"></span> </div>
  </div>
  <div> <strong class="col-sm-2 text-right">Text:</strong>
    <div class="col-sm-10">
      <textarea class="form-control textbox"></textarea>
    </div>
  </div>
  <div> <strong class="col-sm-2 text-right">Link:</strong>
    <div class="col-sm-10"> <a href="#" class="link"></a> </div>
  </div>
  <div> <strong class="col-sm-2 text-right">Image:</strong>
    <div class="col-sm-10"> <img class="img" alt=""> </div>
  </div>
</div>
<script>
// Конвертируем файл с помощью Canvas
function convertImgToDataURLviaCanvas(url, callback, outputFormat) {
  var img = new Image();
  img.crossOrigin = 'Anonymous';
  img.onload = function() {
    var canvas = document.createElement('CANVAS');
    var ctx = canvas.getContext('2d');
    var dataURL;
    canvas.height = this.height;
    canvas.width = this.width;
    ctx.drawImage(this, 0, 0);
    dataURL = canvas.toDataURL(outputFormat);
    callback(dataURL);
    canvas = null;
  };
  img.src = url;
}
// Конвертируем файл с помощью FileReader
function convertFileToDataURLviaFileReader(url, callback) {
  var xhr = new XMLHttpRequest();
  xhr.responseType = 'blob';
  xhr.onload = function() {
    var reader = new FileReader();
    reader.onloadend = function() {
      callback(reader.result);
    }
    reader.readAsDataURL(xhr.response);
  };
  xhr.open('GET', url);
  xhr.send();
}

$('#img2b64').submit(function(event) {
  var imageUrl = $('[name=url]',this).val(),
	convertType = $('[name=convertType]',this).val(),
	convertFunction = convertType === 'FileReader' ?
    convertFileToDataURLviaFileReader :
    convertImgToDataURLviaCanvas;

  convertFunction(imageUrl, uploadImageToServer);

  event.preventDefault();
});

function uploadImageToServer (base64Img){
	$.ajax({
		url: 'upload.php',
		type: 'POST',
		data: {
			image: base64Img
		},
		success: function(result){
			
		}
	});
}
</script>
</body>
</html>


Рядом создаем PHP-файл и пишем:
<?php
if(!empty($_POST['image'])) {
	$data = explode(',', $_POST['image']);
	file_put_contents('my-image.png',base64_decode($data[1]));
}
Какую использовать функцию в JS - с использованием Сanvas или FileReader - уже выбор за вами. В принципе, можно оставить обе, проверять поддерживает ли браузер тот или иной метод и использовать соответствующую функцию.

P.S. Не забудьте указать реальный путь к jQuery и файлу-обработчику!
P.P.S. В общем, подумал и на всякий случай, держите ссылочку на архив. Распакуете на сервер и тестируйте.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы