私は自分のイントラネットページに簡単なファイルアップロードを実装したいと思います。
これは私のHTML部分です。
<input id="sortpicture" type="file" name="sortpic" />
<button id="upload">Upload</button>
これが私のJS jqueryスクリプトです。
$("#upload").on("click", function() {
var file_data = $("#sortpicture").prop("files")[0];
var form_data = new FormData();
form_data.append("file", file_data);
alert(form_data);
$.ajax({
url: "/uploads",
dataType: 'script',
cache: false,
contentType: false,
processData: false,
data: form_data,
type: 'post',
success: function(){
alert("works");
}
});
});
Webサイトのルートディレクトリに "uploads"という名前のフォルダがあり、 "users"と "IIS_users"に対する変更権限があります。
File-formでファイルを選択してアップロードボタンを押すと、最初のアラートは "[object FormData]"を返します。 2番目のアラートは呼び出されず、「uploads」フォルダも空になります。
誰かが私が間違っていることを見つけるのを手伝ってくれる?
次のステップは、ファイルをサーバーサイドで生成された名前に変更することです。たぶん誰かが私にこれのための解決策を与えることができます。
ファイルをuploadsディレクトリに移動するには、サーバー上で実行されるスクリプトが必要です。ブラウザで実行されているjQueryのajax
メソッドがフォームデータをサーバーに送信し、サーバー上のスクリプトがアップロードを処理します。これはPHPを使った例です。
HTMLは問題ありませんが、JS jQueryスクリプトを次のように更新してください。
$('#upload').on('click', function() {
var file_data = $('#sortpicture').prop('files')[0];
var form_data = new FormData();
form_data.append('file', file_data);
alert(form_data);
$.ajax({
url: 'upload.php', // point to server-side PHP script
dataType: 'text', // what to expect back from the PHP script, if anything
cache: false,
contentType: false,
processData: false,
data: form_data,
type: 'post',
success: function(php_script_response){
alert(php_script_response); // display response from the PHP script, if any
}
});
});
そして今度はサーバサイドスクリプトのために、この場合PHPを使います。
upload.php :サーバー上で実行され、ファイルをuploadsディレクトリに転送するPHPスクリプト。
<?php
if ( 0 < $_FILES['file']['error'] ) {
echo 'Error: ' . $_FILES['file']['error'] . '<br>';
}
else {
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);
}
?>
また、宛先ディレクトリについていくつかのことがあります。
upload.php スクリプトで使用されているPHP関数 move_uploaded_file
について少し説明します。
move_uploaded_file(
// this is where the file is temporarily stored on the server when uploaded
// do not change this
$_FILES['file']['tmp_name'],
// this is where you want to put the file and what you want to name it
// in this case we are putting in a directory called "uploads"
// and giving it the original filename
'uploads/' . $_FILES['file']['name']
);
$_FILES['file']['name']
はアップロード時のファイルの名前です。あなたはそれを使う必要はありません。ファイルには任意の名前(サーバーファイルシステム互換)を付けることができます。
move_uploaded_file(
$_FILES['file']['tmp_name'],
'uploads/my_new_filename.whatever'
);
そして最後に、PHP upload_max_filesize
AND post_max_size
設定値に注意し、テストファイルがどちらも超えないようにします。ここにあなたがどのように PHP設定をチェックする そしてどのように{ 最大ファイルサイズを設定して設定を投稿する _するのを手助けします。
var formData = new FormData($("#YOUR_FORM_ID")[0]);
$.ajax({
url: "upload.php",
type: "POST",
data : formData,
processData: false,
contentType: false,
beforeSend: function() {
},
success: function(data){
},
error: function(xhr, ajaxOptions, thrownError) {
console.log(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
}
});
純粋なjsを使用する
async function saveFile()
{
let formData = new FormData();
formData.append("file", sortpicture.files[0]);
await fetch('/uploads', {method: "POST", body: formData});
alert('works');
}
<input id="sortpicture" type="file" name="sortpic" />
<button id="upload" onclick="saveFile()">Upload</button>
<br>Before click upload look on chrome>console>network (in this snipped we will see 404)
ファイル名はリクエストに自動的に含まれ、サーバーはそれを読み取ることができます。「content-type」は「multipart/form-data」に自動的に設定されます。エラー処理と追加のJSON送信を使用した、より発展した例です。
async function saveFile(inp)
{
let user = { name:'john', age:34 };
let formData = new FormData();
let photo = inp.files[0];
formData.append("photo", photo);
formData.append("user", JSON.stringify(user));
try {
let r = await fetch('/upload/image', {method: "POST", body: formData});
console.log('HTTP response code:',r.status);
alert('success');
} catch(e) {
console.log('Huston we have problem...:', e);
}
}
<input type="file" onchange="saveFile(this)" >
<br><br>
Before selecting the file Open chrome console > network tab to see the request details.
<br><br>
<small>Because in this example we send request to https://stacksnippets.net/upload/image the response code will be 404 ofcourse...</small>
これはアップロードされたファイルを受け取るためのphpファイルです
<?
$data = array();
//check with your logic
if (isset($_FILES)) {
$error = false;
$files = array();
$uploaddir = $target_dir;
foreach ($_FILES as $file) {
if (move_uploaded_file($file['tmp_name'], $uploaddir . basename( $file['name']))) {
$files[] = $uploaddir . $file['name'];
} else {
$error = true;
}
}
$data = ($error) ? array('error' => 'There was an error uploading your files') : array('files' => $files);
} else {
$data = array('success' => 'NO FILES ARE SENT','formData' => $_REQUEST);
}
echo json_encode($data);
?>
**1. index.php**
<body>
<span id="msg" style="color:red"></span><br/>
<input type="file" id="photo"><br/>
<script type="text/javascript" src="jquery-3.2.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$(document).on('change','#photo',function(){
var property = document.getElementById('photo').files[0];
var image_name = property.name;
var image_extension = image_name.split('.').pop().toLowerCase();
if(jQuery.inArray(image_extension,['gif','jpg','jpeg','']) == -1){
alert("Invalid image file");
}
var form_data = new FormData();
form_data.append("file",property);
$.ajax({
url:'upload.php',
method:'POST',
data:form_data,
contentType:false,
cache:false,
processData:false,
beforeSend:function(){
$('#msg').html('Loading......');
},
success:function(data){
console.log(data);
$('#msg').html(data);
}
});
});
});
</script>
</body>
**2.upload.php**
<?php
if($_FILES['file']['name'] != ''){
$test = explode('.', $_FILES['file']['name']);
$extension = end($test);
$name = Rand(100,999).'.'.$extension;
$location = 'uploads/'.$name;
move_uploaded_file($_FILES['file']['tmp_name'], $location);
echo '<img src="'.$location.'" height="100" width="100" />';
}