Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP, C#, Unity: Käyttäjän kuvan tallennus

E1ss [24.11.2017 08:38:50]

#

En ole varma onko php oikea kieli tähän mutta ideana olisi että pelissäni käyttäjä voisi tallentaa oman profiilikuvan jonka muut pelaajat näkevät häntä vastaan pelatessa. Teen peliä unityllä ja c# joten sekin ongelma pitäisi ratkaista että miten kuvan saa käyttäjän puhelimesta php koodiin. Olen myös miettinyt facebook kirjautumista mutta siinä on se ongelma että kaikilla ei ole kyseistä palvelua mikä on huono juttu. Eli olisi parempi jos pystyisin itse ottamaan profiilikuvan käyttäjältä ja se tallennnettaisi siten että kuka tahansa voi katsoa sitä niin pitkään kuin kuvan omistaja ei poista sitä. Ja viellä sellainen että onko facebook kirjautumisessa pakko tallentaa kuva jotenkin vai kuinka pystyn näyttämään kuvan muille? Niitä koodeja mitä olen lukenut niin kaikissa pitää ensin itse kirjautua ja sen jälkeen näkee oman profiilikuvan.

Lebe80 [24.11.2017 08:50:18]

#

Pitääkö Facebook-kirjautumisen olla kaikille pakollinen, vai vain halukkaille? Yleensähän fb-kirjautuminen on nimenomaan vain yksi kirjautumistapa muiden rinnalla (eli kirjautuessa sillä luodaan automaattisesti tunnus, ja merkitään tämä fb:stä linkatuksi).

Me ollaan tehty ainakin niin, että fb:stä haetaan profiilikuva ja tallennetaan meidän järjestelmiin, jottei se ole kuin tässä hakuvaiheessa sidoksissa.

Jos ja kun Unityllä voi lähettää post-dataa, niin voit käsitellä tämän datan php:n päässä ihan kuin millä tahansa html-formilla lähetettyä dataa.

php-koodi ei toimi käyttäjän puhelimessa, vaan tarvitset palvelimen tätä varten. Käyttäjä siis voisi täyttää käyttäjätietonsa Unity-pelisi kautta, jonka avulla tiedot lähetetään palvelimella pyörivälle php-skriptille.

Itse tosin alkuun tekisin nämä erillisinä toimintoina, peli olisi peli, hallinta olisi oma php:lla tehty html-sivusto. Pelistä voisi olla linkki tuonne sivustolle, jolloin käyttäjä ohjattaisiin laitteensa selaimella muokkaamaan profiiliaan.

E1ss [24.11.2017 11:13:21]

#

Kiitos vastauksesta. Eli haluan sen profiilikuvan syötettävän pelistä jotta käyttäjälle olisi mahdollisimman helppoa ja mahdollisimman moni tekisi. Voisin tehdä myös mahdollisuuden kirjautua facebookilla mainitsemallasi tavalla. Voisitko nopeasti miten phpllä voin vastaan ottaa post kuvan. Olen käyttänyt post komentoa tekstin kanssa eli toimiiko se sammalla tavalla. Lisäksi voitko näyttää miten tallennan kuvan eli luin jostain että saisi tallennettua mysql tietokantaan mutta joku taas sanoi että kannattaa tehdä oma directory. Eli voisitko näyttää miten teen phpllä nettisicun ja tallennan käyttäjän kuvan siihen että sen voi hakea kuka tahansa.

Metabolix [24.11.2017 16:12:07]

#

Herää kysymys, oletko edes yrittänyt etsiä vastausta itse, koska Googlella kyllä löytyy, ja PHP-osuudesta myös koodivinkki löytyy.

peran [24.11.2017 16:13:05]

#

Riittääkö ?

https://www.php.net/manual/en/features.file-upload.post-method.php

Edit - Metabolix oli jälleen nopeampi.

E1ss [24.11.2017 16:21:42]

#

oho niinpä näkyi löytyvän. Pitää ensikerralla itse etsiä. Kiitos vastauksistanne.

Lisäys: Kun tuossa https://www.ohjelmointiputka.net/koodivinkit/24212-php-tiedoston-l%C3%A4hetys-upload sivulla on ne esimerkki koodit niin mikä minun kannattaisi valita valmiiksi. eli tarkastus, kuva vai kuva-tark? Mikä on paras ja turvallisin. En periaatteessa halua rajoittaa kuvan kokoa että 4k puhelimella otetut kuvat saa myös tallennettua mutta haluan että muoto on png, jpg, yms. kuva muoto ettei kukaan rupea musiikkia tai viruksia lataamaan. En ymmärrä mitä eroa on kuva ja kuva-tark vaihtoehdoilla.

Lisäys: Käytän nyt tuota kuva vaihtoehtoa. Mitä siis pitää laittaa c# koodista postin kautta. Mikäli oikein näyen post metodeita on kaksi jotka ovat: _FILES ja HTTP_POST_FILES. Mitä nämä pitää olla?

Lisäys:

Tässä viellä koodit.

upload.php

<?php
	if (!isset($_FILES) && isset($HTTP_POST_FILES)) {
		$_FILES =& $HTTP_POST_FILES;
	}

	// Tehdään vielä oma poikkeustyyppi virheitä varten.
	class UploadException extends Exception {
		// Luokan vanha sisältö kelpaa meille.
	}

	/**
	 * Tarkistaa, että tiedosto on lähetetty onnistuneesti.
	 * Virhetilanteissa heitetään poikkeus (UploadException).
	 *
	 * @param $input        input-tagin nimi
	 * @param $maksimikoko  suurin sallittu koko tavuina
	 * @return string       palauttaa tiedoston alkuperäisen nimen
	 */

	function upload_tarkista($input, $maksimikoko = null) {
		// Tarkistetaan, että tiedosto on edes yritetty lähettää.
		if (empty($_FILES[$input])) {
			throw new UploadException("Lomakkeella ei ole tiedostoa '{$input}'!");
		}

		// Tarkistetaan tiedoston koko.
		if ($maksimikoko !== null) {
			if ($_FILES[$input]["size"] > $maksimikoko) {
				$_FILES[$input]["error"] = UPLOAD_ERR_FORM_SIZE;
			}
		}

		// Tarkistetaan lähetyksen virhetilanteet.
		// HUOMIO: oikeassa käytössä erilaiset ilmoitukset kannattaisi välittää
		// eri luokissa, jotta esim. käyttäjän virhe (liian suuri tiedosto)
		// olisi mahdollista erottaa palvelimen virheestä (tila lopussa).
		switch ($_FILES[$input]["error"]) {
			case UPLOAD_ERR_OK:
				break;
			case UPLOAD_ERR_INI_SIZE:
			case UPLOAD_ERR_FORM_SIZE:
				throw new UploadException("Tiedosto '{$input}' on sallittua suurempi!");
			case UPLOAD_ERR_PARTIAL:
				throw new UploadException("Tiedoston '{$input}' lataus keskeytyi!");
			case UPLOAD_ERR_NO_FILE:
				throw new UploadException("Tiedosto '{$input}' puuttuu!");
			case UPLOAD_ERR_NO_TMP_DIR:
				throw new UploadException("Palvelimella ei ole paikkaa tiedostoille!");
			case UPLOAD_ERR_CANT_WRITE:
				throw new UploadException("Tiedoston '{$input}' tallentaminen palvelimelle ei onnistunut!");
			case UPLOAD_ERR_EXTENSION:
				throw new UploadException("Jokin PHP:n laajennos esti tiedoston latauksen!");
			default:
				throw new UploadException("Tuntematon virhe tiedoston '{$input}' latauksessa!");
		}
		if (!is_uploaded_file($_FILES[$input]["tmp_name"])) {
			throw new UploadException("PHP:n mukaan tiedoston tmp_name on viallinen!");
		}
		return basename($_FILES[$input]["name"]);
	}

	/**
	 * Tallentaa lähetetyn tiedoston haluttuun paikkaan.
	 *
	 * @param $input   input-tagin nimi
	 * @param $kohde   uusi tiedostonimi
	 * @return string  palauttaa tiedoston alkuperäisen nimen
	 */
	function upload_tallenna($input, $kohde) {
		$nimi = upload_tarkista($input);

		// Tarkistetaan kirjoitusoikeus.
		if (!is_writeable(dirname($kohde)) || (file_exists($kohde) && !is_writeable($kohde))) {
			throw new UploadException("Virhe tiedoston '{$input}' kopioinnissa paikkaan '{$kohde}', ei kirjoitusoikeutta!");
		}

		// Yritetään kopioida tiedosto paikalleen.
		if (!@move_uploaded_file($_FILES[$input]["tmp_name"], $kohde)) {
			$virhe = error_get_last();
			throw new UploadException("Virhe tiedoston '{$input}' kopioinnissa paikkaan '{$kohde}': {$virhe["message"]}!");
		}
		return $nimi;
	}

	/**
	 * Tallentaa lähetetyn tiedoston hallitusti uudella nimellä,
	 * joka muodostetaan alkuperäisestä nimestä ja satunnaisosasta.
	 * Myös tiedostonimen pääte tarkistetaan.
	 *
	 * @param $input       input-tagin nimi
	 * @param $hakemisto   hakemisto, joka merkitään uuden nimen alkuun
	 * @param $paatteet    tiedoston sallitut päätteet
	 * @param $turvapaate  tiedostolle laitettava pääte, jos vanha pääte ei ole sallittu
	 * @return array       palauttaa taulukossa tiedoston vanhan ja uuden nimen
	 */
	function upload_tallenna_turvallinen($input, $hakemisto = ".", $paatteet = array(".jpg", ".gif", ".png", ".txt", ".dat"), $turvapaate = false) {
		$nimi = upload_tarkista($input);

		// Katsotaan, onko annetussa taulukossa tiedoston pääte.
		// Jos ei ole, käytetään annettua päätettä ($turvapaate).
		if (is_array($paatteet)) foreach ($paatteet as $paate) {
			if (substr($nimi, -strlen($paate)) == $paate) {
				$turvapaate = $paate;
				break;
			}
		}

		// Jos $turvapaate puuttuu (eikä muuta löytynyt taulukosta), hylätään tiedosto.
		if ($turvapaate === false) {
			throw new UploadException("Tiedoston '{$input}' nimi ({$nimi}) ei kelpaa!");
		}

		// Luodaan tiedostolle turvallinen nimi ja tallennetaan tiedosto.
		$nimi2 = substr(preg_replace("/[^-_.0-9A-Za-z]/", "", $nimi), 0, 32);
		if (strlen($turvapaate) && substr($nimi2, -strlen($turvapaate)) !== $paate) {
			$nimi2 .= $paate;
		}
		while (true) {
			$kohde = $hakemisto. "/upload_". uniqid("", true). "_". $nimi2;
			if (!file_exists($kohde)) {
				upload_tallenna($input, $kohde);
				return array($nimi, $kohde);
			}
		}
	}
?>

lahetys.php

<?php
	// Käyttöesimerkkejä.
	// Tämä käsittelysivu palauttaa virheilmoitukset käyttäjälle tekstinä.
	// Laitetaan kaikki mahdolliset ilmoitukset näkyviin.
	header("Content-Type: text/plain");
	ini_set("error_reporting", E_ALL | E_STRICT);
	ini_set("display_errors", 1);

	// Otetaan funktiot mukaan.
	require_once("upload.php");


	// Esimerkki: Tarkistetaan tiedoston pääte ja yritetään tallentaa se palvelimelle.
	// Funktion toinen parametri on tallennushakemisto, "." tarkoittaa tätä hakemistoa.
	// HUOMIO! Virhettä ei tässä erikseen käsitellä, joten tulos voi olla ruma!
	list($vanha, $nimi) = upload_tallenna_turvallinen("tiedosto", ".", array(".png", ".jpg", ".jpeg", ".gif"));
	die("Tallennettiin kuva, nimi on {$nimi}, vanha nimi oli {$vanha}.\n");
?>

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta