SQLの窓 イラストAC フリー素材

2019年08月26日

Java : Okhttp( GET ) と Google Gson( JSON => オブジェクト ) で WEB アクセス

Okhttp のダウンロードは、files の jar リンクです。( Maven リポジトリ)

Okhttp は Okiokotlin-stdlib に依存しているのでこれらもダウンロードする必要があります。
import java.io.IOException;

import com.google.gson.Gson;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class Main {

	public static void main(String[] args) {
		
		String url = "https://lightbox.sakura.ne.jp/demo/json/syain_api_bind.php";
		String result = "";
		
		OkHttpClient okHttpClient;		

		okHttpClient = new OkHttpClient();		
		Request.Builder builder = new Request.Builder();
		builder.url(String.format("%s?name=%s", url, "田"));
		Request request = builder.build();

		Response response = null;
		try {
			response = okHttpClient.newCall(request).execute();
			result = response.body().string();
		}
		catch (IOException e) {
			e.printStackTrace();
		}

		System.out.println(result);

		Gson gson = new Gson();

		Syain[] syains = gson.fromJson(result, Syain[].class);

		for (Syain syain : syains) {
			System.out.println(syain.社員コード);
			System.out.println(syain.氏名);
			System.out.println(syain.フリガナ);
		}

	}

	private class Syain {

		public String 社員コード;
		public String 氏名;
		public String フリガナ;

	}

}




posted by at 2019-08-26 22:41 | Java | このブログの読者になる | 更新情報をチェックする

C# : PHP と連携してバイナリデータを WebClient.UploadDataAsync でそのままアップロードする

WebClient.UploadDataAsync Method

バイナリデータは、HTTP のボディ部分で送られるので、ファイル名は HTTP ヘッダにセットして渡します
using System;
using System.IO;
using System.Net;
using System.Windows.Forms;

namespace WebPut
{
	public partial class Form1 : Form
	{
		// 読み込むファイルのパス
		string image_path = @"C:\Users\sworc\Pictures\IMG0330.JPG";

		public Form1()
		{
			InitializeComponent();
		}

		private void button1_Click(object sender, EventArgs e)
		{
			WebClient webClient = new WebClient();
			// ファイル名を HTTP ヘッダーで渡す
			webClient.Headers.Add("UserData", Path.GetFileName(image_path));

			// イベント作成
			webClient.UploadDataCompleted += (object _sender, UploadDataCompletedEventArgs _e) => {

				if (_e.Error != null)
				{
					// エラー
					Console.WriteLine(_e.Error.Message);
				}
				else
				{
					// サーバからの応答( バイト配列なのでテキストに変換 )
					Console.WriteLine(System.Text.Encoding.GetEncoding("UTF-8").GetString(_e.Result));
				}

			};

			// 画像ファイルをバイト配列に読み込む
			FileStream file_stream = new FileStream(image_path, FileMode.Open, FileAccess.Read);
			byte[] bin_buffer = new byte[file_stream.Length];
			file_stream.Read(bin_buffer, 0, (int)file_stream.Length);
			file_stream.Close();

			// バイナリデータアップロード開始
			string access_url = "http://localhost/php/upload/php-put.php";
			webClient.UploadDataAsync(new Uri(access_url), bin_buffer);

		}
	}
}


PHP 側は、php://input を利用した単純なコードです。

php-put.php
<?PHP
header( "Content-Type: text/html; charset=utf-8" );

$id = uniqid();

$fp = fopen( "php://input", "rb" );
$wfp = fopen( "data/{$id}_{$_SERVER["HTTP_USERDATA"]}", "wb" );

while( $ret = fread( $fp, 4096 ) ) {

	fwrite( $wfp, $ret );

}

fclose($wfp);
fclose($fp);

?>
データが保存されました




posted by at 2019-08-26 21:25 | C# | このブログの読者になる | 更新情報をチェックする

C# : WebClient で JSON データを取得後 Json.NET でオブジェクト化( ついでに PropertyInfo でプロパティデータ一覧を foreach で取得 )

Json.NET は ダウンロードボタンで NuGet 用のコマンドラインが表示されます

Json.NET でオブジェクトに変換するだけならば、 { set; get; } でプロパティ化せずとも単純な public な変数の定義で可能です。ここでは、プロパティの名前の一覧を配列で準備して foreach でデータを取得できるように { set; get; } でプロパティ化しています。
using Newtonsoft.Json;
using System;
using System.Net;
using System.Reflection;
using System.Text;
using System.Web;
using System.Windows.Forms;

namespace WebJson
{
	public partial class Form1 : Form
	{

		// フィールド名一覧
		private string[] field_names = {"社員コード", "氏名", "フリガナ", "所属", "性別", "作成日", "更新日", "給与", "手当", "管理者" };

		public Form1()
		{
			InitializeComponent();
		}

		private void action_Click(object sender, EventArgs e)
		{
			WebClient webClient = new WebClient();
			webClient.Encoding = Encoding.GetEncoding("utf-8");

			// DownloadStringCompleted の引数は、https://docs.microsoft.com/ja-jp/dotnet/api/system.net.downloadstringcompletedeventhandler
			webClient.DownloadStringCompleted += (object _sender, DownloadStringCompletedEventArgs _e) => {

				Console.WriteLine(_e.Result);

				// Json.NET は、NuGet でインストールします : Install-Package Newtonsoft.Json
				// https://www.newtonsoft.com/json
				JsonData[] data = JsonConvert.DeserializeObject<JsonData[]>(_e.Result);

				// 画面にデータをセット
				name.Text = data[0].氏名;
				furi.Text = data[0].フリガナ;

				// プロパティ名一覧より、データを取得
				PropertyInfo property;
				string value;
				foreach (string name in field_names)
				{
					property = typeof(JsonData).GetProperty(name);
					value = property.GetValue(data[0]).ToString();
					Console.WriteLine(value);
				}

			};

			// HttpUtility.UrlEncode は System.Web を参照する必要があります
			string access_url_query_string = $"https://lightbox.sakura.ne.jp/demo/json/syain_api_bind.php?name={HttpUtility.UrlEncode("田", Encoding.UTF8)}";

			// WEB データ取得開始
			webClient.DownloadStringAsync(new Uri(access_url_query_string));

		}

		private class JsonData
		{
			// PropertyInfo.GetValue を使用する為に { set; get; } でメソッド化しています
			public string 社員コード { set; get; }
			public string 氏名 { set; get; }
			public string フリガナ { set; get; }
			public string 所属 { set; get; }
			public int 性別 { set; get; }
			public DateTime 作成日 { set; get; }
			public DateTime 更新日 { set; get; }
			public int 給与 { set; get; }
			public int 手当 { set; get; }
			public string 管理者 { set; get; }
		}
	}
}




posted by at 2019-08-26 20:08 | C# | このブログの読者になる | 更新情報をチェックする

IE11 : フォルダを選択して、フォルダ内のフォルダとファイルの一覧を jQuery で表示する

Windows の標準の COM では、ファイルを選択するダイアログを使用できません。( Excel がインストールされておれば使えます )

しかし、Shell.Application を使用すれば、フォルダの選択は可能なうえにファイルの一覧をフォルダオブジェクトより取得して利用可能です。

<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width initial-scale=1.0 minimum-scale=1.0 maximum-scale=1.0 user-scalable=no" name="viewport">
<meta charset="utf-8">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css">

<link rel="stylesheet" href="https://lightbox.sakura.ne.jp/demo/two-section.css">

<script>
// Windows Shaell
var objShell = new ActiveXObject("Shell.Application");

$(function(){

	$("#action").on("click", function(){

		buildTable( );

	});

});

// ******************************
// jQuery でテーブル作成
// ******************************
function buildTable( ){

	// 1:0固定, 2:タイトル, 3:1はファイルシステムのみ, 4:0はルートがデスクトップ
	// 4:https://docs.microsoft.com/en-us/windows/win32/api/shldisp/ne-shldisp-shellspecialfolderconstants
	var objFolder = objShell.BrowseForFolder( 0, "フォルダ選択", 1, 0 );
	if ( objFolder == null ) {
		alert("フォルダの選択がキャンセルされました");
		return;
	}
	if ( !objFolder.Self.IsFileSystem ) {
		alert("ファイルシステムではありません");
		return;
	}

	// TABLE 部分クリア
	$("#tbl").html("");

	var objFolderItems = objFolder.Items();

	var nFiles = objFolderItems.Count;
	var arrData = [];

	// フォルダとファイルの一覧を配列にセット
	var nFiles = objFolderItems.Count;
	for( i = 0; i < nFiles; i++ ) {
		var objItem = objFolderItems.Item(i)
		// フォルダの場合
		if ( objItem.isFolder ) {
			arrData.push( " [" + objItem.Name +"]" );
		}
		else {
			arrData.push( objItem.Name );
		}
	}

	arrData.sort();
	arrData.unshift("-------------------------------------------------------------");
	// 選択したフォルダのパス
	arrData.unshift(objFolder.Self.Path);

	// TABLE に一覧を作成する
	for( i = 0; i < nFiles; i++ ) {
		var tr = $("<tr class='rowdata'></tr>")
			.appendTo("#tbl");

		$("<td></td>")
			.appendTo(tr)
			.text(arrData[i]);
	}

}
</script>

</head>
<body>
	<div id="head">
		<input
			id="action"
			class="ml-4 btn btn-outline-primary"
			type="button"
			value="フォルダ選択">
	</div>

	<div id="extend">
		<table class="table">
		<tbody id="tbl">

		</tbody>
		</table>

	</div>

</body>
</html>










posted by at 2019-08-26 13:30 | IE | このブログの読者になる | 更新情報をチェックする

2019年08月25日

PHP : 画像を返す処理( readfile ) と画像を縮小する処理( GD )

この PHP を指定ファイル名で呼び出すと、幅を 100px で縮小された画像を返します( 無ければ縮小画像を返します )。

▼ 縮小
imagecopyresampled
<?php
$debug = false;

// *************************************
// 画像があるフォルダの相対パス
// *************************************
$image_dir = 'images';

// *************************************
// QueryString より対象の
// 画像ファイル名を取得
// *************************************
$file = "{$image_dir}/{$_GET['name']}";

// *************************************
// 画像が存在しない場合は、
// エラー用の画像をブラウザに返す
// *************************************
if ( !file_exists( $file ) || $_GET['name'] == '' ) {
	header("Content-Type: image/png");
	$file = "{$image_dir}/error.png";
	header('Content-Length: ' . filesize($file));
	readfile($file);
	exit();
}

// *************************************
// ファイルの MIME を取得
// *************************************
$mime = image_type_to_mime_type( exif_imagetype( $file ) );

// *************************************
// ファイル名から拡張子を除いた部分を
// 取得して、縮小ファイルのファイルの
// パスを作成する( .jpg )
// *************************************
$path_parts = pathinfo($_GET['name']);
$small_file = "{$image_dir}/s/{$path_parts['filename']}.jpg";

// *************************************
// 縮小ファイルがなければ作成して
// ブラウザに返す、あればそのまま返す
// *************************************
if ( !file_exists( $small_file ) ) {
	if ( ImageConvert( $image_dir, $_GET['name'], exif_imagetype( $file ) ) ) {
		header("Content-Type: image/jpeg");
		header('Content-Length: ' . filesize($small_file));
		readfile($small_file);
	}
	else {
		// 縮小に失敗した場合は、大きい元のファイルを返す
		header("Content-Type: {$mime}");
		header('Content-Length: ' . filesize($file));
		readfile($file);
	}
}
else {
	header("Content-Type: image/jpeg");
	header('Content-Length: ' . filesize($small_file));
	readfile($small_file);
}

// *************************************
// ファイルを縮小して保存
// *************************************
function ImageConvert( $dir, $filename, $type ) {

log_print( "$dir, $filename, $type" );

	// *************************************
	// ファイルの属性等を取得
	// *************************************
	$target	= getimagesize( "$dir/$filename" );

log_print( print_r($target,true) );
 
	// 現在のサイズ
	$width	= $target[0];
	$height	= $target[1];

	$width_new	= 100;	// 幅固定

	// *************************************
	// 縮小後の高さを計算で求める
	// *************************************
	$height_new = (int)( ($height/$width)*$width_new );

	$target_path = "$dir/$filename";

	$jpeg = false;

	// *************************************
	// 画像の種類によって、オブジェクト作成方法を選択する
	// *************************************
	if ( $type == 2 ) {
		$jpeg = @imagecreatefromjpeg( $target_path );
	}
	if ( $type == 3 ) {
		$jpeg = @imagecreatefrompng( $target_path );
	}
	if ( $type == 4 ) {
		$jpeg = @imagecreatefromgif( $target_path );
	}
	if ( $jpeg === false ) {
		return false;
	}

log_print( "現画像取得" );

	// *************************************
	// 新しい空のイメージ
	// *************************************
	$jpeg_new = @imagecreatetruecolor( $width_new, $height_new );
	if ( $jpeg_new === false ) {
		return false;
	}

log_print( "新しい画像取得" );

	// *************************************
	// サイズ変更して新しいイメージへ転送
	// *************************************
	$ret = @imagecopyresampled(
		$jpeg_new,
		$jpeg,
		0,
		0,
		0,
		0,
		$width_new,
		$height_new,
		$width,
		$height
	);

	if ( !$ret ) {
		return false;
	}

log_print( "縮小完了" );

	// *************************************
	// JPEG ファイルとして、
	// クオリティ 75 で出力
	// *************************************
	$path_parts = pathinfo($filename);
	$ret = @imagejpeg ( $jpeg_new, "$dir/s/{$path_parts['filename']}.jpg", 75 );
	if ( !$ret ) {
		return false;
	}

log_print( "ファイル出力完了:$dir/s/{$path_parts['filename']}.jpg" );

	return true;
}


// *************************************
// デバッグログ
// *************************************
function log_print( $msg ) {

	if ( !$GLOBALS['debug'] ) {
		return false;
	}

	file_put_contents("debug.log", $msg ,FILE_APPEND );
	file_put_contents("debug.log", "\n" ,FILE_APPEND );

}


?>





posted by at 2019-08-25 22:06 | PHP | このブログの読者になる | 更新情報をチェックする

2019年08月23日

下半分が IFRAME なページ【 height: calc( 100% - 120px ) 】

デモページ

関連する記事

下半分がスクロールするページ【 height: calc( 100% - 120px ) 】

<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width initial-scale=1.0 minimum-scale=1.0 maximum-scale=1.0 user-scalable=no" name="viewport">
<meta charset="utf-8">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css">

<link rel="stylesheet" href="https://lightbox.sakura.ne.jp/demo/two-section-iframe.css">
</head>
<body>
	<div id="head">
	</div>

	<iframe id="extend" name="extend" class="iframe-option" src="/demo/template/basic/basic-php-iframe-req/req/control.php"></iframe>

</body>
</html>



two-section-iframe.css
@charset utf-8;


/* ****************************
 上下エリア
 フィットコントロール用
******************************/
html,body {
	height: 100%;
}
/* ****************************
 それぞれのエリアの特性
******************************/
/* 基本枠 */
body {
	margin: 0;
}
/* 上固定部分 */
#head {
	padding: 16px;
	display: block;
	margin: auto;
	width: 100%;							/* 幅 */
	height: 120px;							/* 高さ */
	background-color: #e0e0e0;
}
/* 下スクロール部分 */
#extend {
	display: block;
	margin: auto;
	width: calc( 100% - 3px );				/* 幅 */
	height: calc( 100% - 120px - 2px );		/* 高さ */
	border: solid 2px #c0c0c0;
}





posted by at 2019-08-23 08:28 | CSS | このブログの読者になる | 更新情報をチェックする

2019年08月22日

JScript( WSH ) : fake sendmail for windows でメールを送信する

関連する記事

fake sendmail for windows を使って、PHP でごく普通に( mb_send_mail で )メール送信 : Gmail なので ssl(465)
VBScript : JavaScript のライブラリを呼び出して、Base64 エンコードを行う

ソースコードを読んだら、標準入力に -t は必要無くて、引数にファイルを指定して実行可能でした。

JScript で実行する以上、標準入力に直接アクセスして処理しています。

テストすると、今時の WEB メーラでは本文は普通に UTF-8 で利用可能でした。有名どころの WEB メーラですと、Subject も そのままで可能でしたが、まだ対応されていない業者もあったので、JavaScript の Base64 変換ライブラリを使用しています。
<JOB>
<SCRIPT language="JScript" src="https://winofsql.jp/base64.js"></SCRIPT>
<SCRIPT language="JScript">

WshShell =  new ActiveXObject("WScript.Shell");

// ファイルを作成して引数で渡しても実行可能
var oExec = WshShell.Exec("\"C:\\pleiades\\xampp\\sendmail\\sendmail.exe\"");

var mail_text = getResource("mail_data");


// 先頭の空白文字列を取り去る
mail_text = mail_text.replace(/^[ \s]+/, "");

// http://logicalerror.seesaa.net/article/151155394.html
var subject = Base64.encode("日本語の表示");

// UTF8 文字列を BASE64 に変換したものをセット
mail_text = mail_text.replace(/--UTF8TEXT--/, subject);

// 本文を渡す
oExec.StdIn.Write( mail_text );

// 標準入力を終了
oExec.StdIn.Write(String.fromCharCode(0x1a));

// 実行が終わるまで待つ
while (oExec.Status != 1) {

	WScript.Sleep(2000);
}
</SCRIPT>
<RESOURCE id="mail_data">
From: a@yourdomain.jp
To: 送り先メールアドレス
Subject: =?utf-8?B?--UTF8TEXT--?=

mail testing

abcdef

あいうえお
</RESOURCE>

</JOB>


base64.js のオリジナルサイト



posted by at 2019-08-22 14:56 | WSH( JScript ) | このブログの読者になる | 更新情報をチェックする

JSP で単純な MySQL アクセス ( mysql-connector-java-5.1.47.jar )

C:\pleiades\xampp\tomcat\lib\mysql-connector-java-5.1.47.jar を使用しています。

関連する記事

Java : 単純な MySQL アクセス ( mysql-connector-java-5.1.47.jar )
<%@ page
	language="java"
	import="java.io.*"
	import="java.text.*"
	import="java.util.*"

	import="java.text.SimpleDateFormat"
	import="com.mysql.jdbc.*"
	import="java.sql.DriverManager"
	import="java.sql.ResultSet"
	import="java.sql.SQLException"

	contentType="text/html;charset=utf-8" %>
<%!
// *********************************************************
// ローカル関数
// *********************************************************
public String getData( HttpServletRequest request,String name ) {

	String strGet = request.getParameter(name);
	if ( strGet == null ) {
		strGet = "";
	}

	return strGet;
}
%>
<%
// *********************************************************
// 入力値の表示
// GET で setCharacterEncoding を有効にするには
// sever.xml => Connector で useBodyEncodingForURI="true"
// *********************************************************
request.setCharacterEncoding("utf-8");	// 入力値のエンコーディング

// GET 入力
String strGet = getData( request, "InputGet" );

// POST 入力
String strPost = getData( request, "InputPost" );

%>
<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width initial-scale=1.0 minimum-scale=1.0 maximum-scale=1.0 user-scalable=no" name="viewport">
<meta charset="utf-8">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css">

<link rel="stylesheet" href="https://lightbox.sakura.ne.jp/demo/two-section.css">
<style>
.result {
	display: inline-block;
	width: 400px;
	border: 1px solid #c0c0c0;
	padding: 10px;
}
</style>
</head>
<body>
	<div id="head">
		<div class="result">InputGet = <%= strGet %> </div><div class="result"> InputPost = <%= strPost %></div>
	</div>

	<div id="extend">

		フォーム : GET( InputGet )
		<form method="get">
			<input type="text" name="InputGet" value="<%= strGet %>">
			<input class="btn btn-primary" type="submit" name="send_get" value="GET">
		</form>
		
		フォーム : POST( InputPost )
		<form method="post">
			<input type="text" name="InputPost" value="<%= strPost %>">
			<input class="btn btn-primary" type="submit" name="send_post" value="POST">
		</form>

		<hr>

<%

// データベース用変数
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;

try {

	Class.forName("com.mysql.jdbc.Driver");
	// MySQL Connector/J 接続
	conn = (Connection) DriverManager.getConnection(
		"jdbc:mysql://localhost/lightbox?user=root&password="
	);

	stmt = (Statement) conn.createStatement();

	if ( getData( request, "send_post" ).equals( "POST" ) ) {
		// % は %% で表現
		rs = stmt.executeQuery( String.format( "select * from 社員マスタ where 氏名 like '%%%s%%'", strPost) );
	}
	else {
		rs = stmt.executeQuery("select * from 社員マスタ");
	}

	// select の結果の列情報の取得
	ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();

	// 列数
	int columnCount = rsmd.getColumnCount();

	// 列名
	for( int i = 1; i <= columnCount; i++) {
		out.println(rsmd.getColumnName(i));
	}
	out.println("\n<br>");

	// 日付フォーマット
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
	while( rs.next() ) {

		for( int i = 1; i <= columnCount; i++) {

			if ( i != 1 ) {
				out.println(",");
			}

			// 日付型の列
			if ( rsmd.getColumnTypeName(i).equals("DATETIME") ) {
				out.println( sdf.format(rs.getDate(i)) );
			}
			// それ以外
			else {
				out.println( rs.getString(i) );
			}


		}
		out.println("\n<br>");
	}

	rs.close();
	stmt.close();
	conn.close();

} catch (SQLException ex) {
	// handle any errors
	out.println("SQLException: " + ex.getMessage());
	out.println("SQLState: " + ex.getSQLState());
	out.println("VendorError: " + ex.getErrorCode());
}

%>

	</div>

</body>
</html>






posted by at 2019-08-22 11:42 | Java | このブログの読者になる | 更新情報をチェックする

Java : 単純な MySQL アクセス ( mysql-connector-java-5.1.47.jar )

C:\pleiades\java\8\jre\lib\mysql-connector-java-5.1.47.jar を使用しています。

※ mysql-connector-java-8.0.11 で serverTimezone=JST が必要

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;

public class Main {

	public static void main(String[] args) {

		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;

		String connectionString = "jdbc:mysql://localhost/lightbox?user=root&password=";

		try {
			// 接続文字列で接続
			conn = (Connection) DriverManager.getConnection(connectionString);

			String query = "select * from 社員マスタ";

			stmt = (Statement) conn.createStatement();
			rs = stmt.executeQuery(query);

			String scode;
			String sname;
			while( rs.next() ) {

				scode = rs.getString(1);
				sname = rs.getString(2);

				System.out.print(String.format("番号 : %s,%s / ", scode, sname));

				scode = rs.getString("社員コード");
				sname = rs.getString("氏名");

				System.out.println(String.format("列名 : %s,%s", scode, sname));


			}


			rs.close();
			stmt.close();
			// 接続を閉じる
			conn.close();

		} catch (SQLException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}


		System.out.println("終了");
	}

}




posted by at 2019-08-22 10:29 | Java | このブログの読者になる | 更新情報をチェックする

2019年08月21日

一般的な PHP のアップロードページに対して jQuery の $.ajax でファイルをアップロードする

PHP における標準的なテスト用アップロードのテンプレート に対してアップロードしています。

ファイルのアップロードの PHP 側のインターフェイスに合わせてデータを用意して実行します。
PHP では、エラーの場合ページに文字列が出力されるたけなので、その文字列を検索して結果を判断します。

FileReader を使用して、選択したファイルが画像の場合は img 要素で表示し、それ以外ならば FileReader 由来のファイル名と MIME を表示します
<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width initial-scale=1.0 minimum-scale=1.0 maximum-scale=1.0 user-scalable=no" name="viewport">
<title>単純ファイルアップロード</title>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css">

<link rel="stylesheet" href="https://lightbox.sakura.ne.jp/demo/two-section.css">
<style>
#extend {
	white-space: pre;
}
</style>

<script>

$(function(){

	// ***************************
	// form 送信イベント
	// ***************************
	$("#frm").on("submit", function(event){

		// 本来の処理をキャンセル
		event.preventDefault();

		// 新規送信用オブジェクト
		var formData = new FormData();

		// テストの為、約100K の制限
		formData.append("MAX_FILE_SIZE", 1048576);

		// ファイル
		var uploadData = $("#target").get(0);

		formData.append("target", uploadData.files[0]);

		// オリジナルファイル名
		console.log( uploadData.files[0].name );

		// **************************************
		// サーバ呼び出し
		// **************************************
		$.ajax({
			url: "http://localhost/php/upload/php-upload-basic.php",
			type: "POST",
			data: formData,
			processData: false,  // jQuery がデータを処理しないよう指定
			contentType: false   // jQuery が contentType を設定しないよう指定
		})
		.done(function( data, textStatus ){
			console.log( "status:" + textStatus );

			// ajax 対応のページでは無いので、ページ上の文字列を検索して判断する
			if ( data.search(/失敗/) != -1 ) {
				alert("アップロードに失敗しました");
			}

		})
		.fail(function(jqXHR, textStatus, errorThrown ){
			console.log( "code:" + jqXHR.status );
			console.log( "status:" + textStatus );
			console.log( "errorThrown:" + errorThrown );

			// エラーメッセージを表示
			alert("システムエラーです");

		})
		.always(function() {
		})
		;

	});

	// *************************************
	// ファイル選択 <input type="file">
	// *************************************
	$("#target").on("change", function(){

		$("#extend").html("");

		var reader = new FileReader();

		reader.name = this.files[0].name;
		reader.type = this.files[0].type;
		
		console.dir(reader);

		reader.refid = "image";

		// FileReader に画像が読み込まれた時のイベント
		$(reader).on("load", function () {
		
			if ( this.type.indexOf("image/") == 0 ) {
				$("<img>").appendTo("#extend")
					.prop( {"src": this.result, "title": this.name, "id": this.refid } )	// title にはオリジナルファイル名
					.css( {"width": "100px", "margin": "10px" } );
			}
			else {
				$("<div>").appendTo("#extend")
					.html( this.name + "<br>" + this.type );
			}
			
		});

		// 上記イベントを発動するための処理( this.files[i] は blob )
		if (this.files[0]) {
			reader.readAsDataURL(this.files[0]);
		}

	});
	

});

</script>

</head>
<body>
	<div id="head">
		<form
			id="frm">
		
			<div>
				<input id="target" type="file" class="ml-4 btn btn-outline-primary">
				<input type="submit" name="send" value="アップロード" class="ml-4 btn btn-outline-primary">
				<a class="ml-4 btn btn-info" href="/php/upload/php-upload-basic.php">GET 再読み込み</a>
			</div>
		 
		</form>
	</div>

	<div id="extend">

	</div>

</body>
</html>





posted by at 2019-08-21 20:00 | jQuery | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します