Axios + Nette REST API – funkce pro file upload

- Mára98
 - Člen | 47
 
Dobrý den,
na clientovi odesílám skrze Axios requesty s FormData – obrázky, zip soubory a tak dále. Na straně backendu se snažím v Nette udělat jednoduchou REST api. Jak přesně by měla vypadat v Nette funkce, která data převezme a nahrané soubory uloží třeba do složky uploads? Sem v Nette nový, tak se omlouvám, jestli mi něco uchází. Marně s tím bojuji už druhý den.
Předem děkuji za jakékoliv rady.

- Milo
 - Nette Core | 1283
 
Něco o práci s HTTP protokolem v Nette, ikdyž spíš o responses: https://blog.nette.org/…ovedi-cast-1
Pro tebe je tam důležitá metoda presenteru getHttpRequest() a
API https://api.nette.org/…Request.html
Napiš si akci presenteru, v ní se přes zmíněné API dostaneš k odeslaným datům. Jak je uložíš je na tobě.

- Mára98
 - Člen | 47
 
Ahoj, děkuju mockrát za nasměrování a tvůj čas. Už cítím, že se blížím, ale furt někde něco dělám špatně. Momentálně mám tohle:
Latte / HTML:
<input type="file" id='fileupload'>
<button onclick='upload()'>Upload</button>
JavaScript:
// Upload file
function upload() {
    // Creates new form data
    var data = new FormData();
    // Gets file upload input
    var input = document.querySelector('#fileupload');
    // Append data
    data.append('file', input.files[0]);
    // Send request
    axios.post('http://localhost:8888/odevzdat/www/api/data', data, {
        headers: {
            'Content-Type': 'multipart/form-data'
        }
    })
    .then(function (response) {
        // Handle success
        console.log(response);
    })
    .catch(function (error) {
        // Handle error
        console.log(error);
    });
}
PHP:
// Handles file upload logic on server side
public function actionData()
{
	// Get HTTP request
	$request = $this->getHttpRequest();
	// Get data
	$data = $request->getHeader('file');
	// Send data back
	$this->sendJson([
		'data' => $data
	]);
}
Když mi pak přijde response, data jsou null. Co dělám špatně?
Editoval Mára98 (19. 1. 2019 15:08)

- Mára98
 - Člen | 47
 
Ještě malý update: když změním akci v presenteru tak, aby rovnou vrátila získaný request zpět, dostanu zase null.
// Handles file upload logic on server side
public function actionData()
{
	// Get HTTP request
	$request = $this->getHttpRequest();
	// Send data back
	$this->sendJson([
		'data' => $request
	]);
}
Tohle mi taky moc nevyšlo:
// Handles file upload logic on server side
public function actionData()
{
	// Get files
	$files = $this->getHttpRequest()->getFiles();
	// Send data back
	$this->sendJson([
		'data' => $files
	]);
}
Hádám, že to asi celý chápu úplně špatně.
Editoval Mára98 (19. 1. 2019 15:22)

- Mára98
 - Člen | 47
 
Tak sem přišel na to, že ještě musím tlačítko a input zabalit do
formu s enctype='multipart/form-data' :
<form enctype='multipart/form-data'>
    <input type="file" id='fileupload' >
    <button onclick='upload()'>Upload</button>
</form>
Dostávám ale teď úplně prázdný axios Network error tak na
čtvrt sekundy a pak se stránka hned refreshne.
Editoval Mára98 (19. 1. 2019 16:07)