html上傳原理
㈠ 文件上傳的基本原理,用文字詳細說明一下
我藉助別人的資料,感覺挺詳細,仔細研究一下吧
中文件上傳與下載1。上傳文件流程
先通過用戶提交文件,保存文件到伺服器端,然後在寫入資料庫中,每次到下載頁面時從資料庫中讀出文件,生成文件在伺服器目錄中,以下。。。
文件上傳後保存文件到伺服器中jsp,
upFile.jsp
<%@ page contentType="text/html; charset=utf-8" language="java" %>
< import="java.util.List;"%>
<html>
<head>
<title>上傳文件</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<base target="_self">
<link href="Css/style.css" rel="stylesheet">
<script type="text/javascript">
function check(){
var file = document.getElementById("file1").value;
if(file == ""){
alert('請選擇要上傳的文件');
return false;
}else{
window.returnValue=file;
return true;
}
}
</script>
</head>
<body>
<%
String files=request.getParameter("files");
%>
<form name="form2" enctype="multipart/form-data" method="post" action="../MissionManage/commonfile.jsp?files=<%=files %>" onsubmit="return check();">
<center>
<table align="center" width="350" height="150" border="0" cellpadding="0" cellspacing="0"><!-- background="images/upFile_bg.gif -->
<tr>
<td valign="top"><table width="100%" height="145" border="0" cellpadding="0" cellspacing="0">
<tr>
<td height="49" colspan="2"></td>
</tr>
<tr>
<td width="9%" height="53"></td>
<td width="91%"><b>請選擇上傳的文件:</b><br>
<input id="file1" name="file1" type="file" size="35" onkeydown="return false;">
<br>
註:文件大小請控制在10M以內。</td>
</tr>
<tr>
<td colspan="2" align="center"><input name="Submit" type="submit" class="btn_grey" value="確認">
<input name="Submit2" type="button" class="btn_grey" onClick="window.close()" value="關閉"></td>
</tr>
</table></td>
</tr>
</table>
</center>
</form>
</body>
</html>
commonfile.jsp
<%@ page language="java" import="java.io.*" pageEncoding="UTF-8"%>
< import="java.util.*,org.apache.commons.fileupload.FileItem" %>
< import="java.text.SimpleDateFormat,java.util.Date" %>
< import="com.PoliceSystem.tools.FileOperate" %>
<jsp:useBean id="factory" scope="page" class="org.apache.commons.fileupload.disk.DiskFileItemFactory" />
<jsp:useBean id="upload" scope="page" class="org.apache.commons.fileupload.servlet.ServletFileUpload" />
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>上傳文件</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<base target="_self">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript" language="javascript">
</script>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
String path1 = (String)request.getRealPath("/upload1");
String files=request.getParameter("files");
String[] fileList=files.split(";");
File file = new File(path1);
if(!file.exists()){
file.mkdirs();
}
factory.setRepository(file);
factory.setSizeThreshold(1024*1024);
upload.setFileItemFactory(factory);
try{
List<FileItem> list= upload.parseRequest(request);
for(FileItem item:list){
if(item.isFormField()){
//String value=item.getString("UTF-8");
//session.setAttribute("fileName", value);
}else{
String value=item.getName();
int start=value.lastIndexOf("\\");
String fileName=value.substring(start+1);
if(fileName.length() == 0 || fileName == ""){
out.println("<script>alert('上傳失敗');window.close();</script>");
}else{
if(item.getSize()>10000000){
out.println("<script>alert('對不起,您上傳的文件超過10M,無法完成上傳!');window.close();</script>");
}else{
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
Date date =new Date();
String[] f = item.getName().split("\\\\");
//System.out.println(f[f.length-1]);
String oldFileName = f[f.length-1];
for(int i=0;i<fileList.length;i++){
if(fileList[i].indexOf(oldFileName)!=-1){
out.println("<script>alert('對不起,您上傳的文件與現有上傳的文件重名,請更換文件名重新上傳!');window.returnValue='';window.close();</script>");
}
}
String fType = FileOperate.getFileType(item.getName());//文件類型
fileName = sdf.format(date)+"."+fType;//新文件名
//System.out.println(item.getName()+"---"+fileName);
item.write(new java.io.File(path1,fileName));
//////--1--/////
String mailFileNames = new String();
String old = (String)session.getAttribute("fuJianFileNames");
if(old!=null){
mailFileNames = old;
}
mailFileNames+=oldFileName+"|"+fileName+";";
//System.out.println("mailFileNames="+mailFileNames);
session.removeAttribute("fuJianFileNames");
session.setAttribute("fuJianFileNames", mailFileNames);
//////--2--/////
//String pathName = path1+";
//System.out.println("pathName="+pathName);
out.println("<script>window.close();</script>");
}
}
}
}
}catch (Exception e) {
e.printStackTrace();
out.println("<script>window.close();</script>");
}
%>
</body>
</html>
插入文件數據到資料庫中
public boolean insert_annex(String[] str){
boolean b=true;
String sql ="";
con = db.getConn();
try{
sql="insert into annex (querykey,sfilename,committime,Filetype,filepath,pno,Annex) values (?,?,?,?,?,?,?)";
ps = con.prepareStatement(sql);
for(int i=0;i<str.length-1;i++){
ps.setString(i+1, str[i]);
}
File file = new File(str[6]);//附件
InputStream iso = new FileInputStream(file);
ps.setBinaryStream(7, iso, iso.available());
ps.execute();
iso.close();
System.out.println("刪除臨時文件:" + file.delete());// 刪除tmp文件
}catch(Exception e){
b=false;
e.printStackTrace();
}finally{
this.close();
}
return b;
}
讀出文件數據,並保存
public boolean addTempFile_annex(String querykey,HttpServletRequest request){
boolean b=true;
con = db.getConn();
InputStream in = null;
OutputStream out= null;
String path1 = (String)request.getRealPath("/upload1");//文件下載臨時目錄
try{
String sql="select filePath,annex from annex where querykey='"+querykey+"'";
//String sql_1="select annex from annex where querykey='"+querykey+"'";
ps = con.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()){
File f = new File(path1+rs.getString("filepath"));
in=rs.getBinaryStream("annex");
out = new FileOutputStream(f);
int len = 10 * 100 * 100; //定義字元數組長度
byte[] P_Buf=new byte[len];
int j;
while((j=in.read(P_Buf))!=-1){
out.write(P_Buf, 0, j);
}
}
in.close();
out.flush(); //強制清出緩沖區
out.close();
}catch(Exception e){
b=false;
e.printStackTrace();
}finally{
this.close();
}
return b;
}
給定傳遞過來的參數(文件名,文件存儲在伺服器的文件名,文件在伺服器的路徑,文件類型),下載文件Action
package com.PoliceSystem.action.mail;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class downLoadFile extends ActionSupport{
private static final long serialVersionUID = -2207648627734251737L;
public String execute() throws Exception{
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
String fileminitype = request.getParameter("fileType");
String filename1 = new String(request.getParameter("fileName1").getBytes("ISO8859-1"),"UTF-8");
String filename2 = new String(request.getParameter("fileName2").getBytes("ISO8859-1"),"UTF-8");
String filepath = request.getRealPath("/upload1");
File f = new File(filepath+");
Long filelength = f.length();
int cacheTime = 10;
response.setContentType(fileminitype);
response.setHeader("Location",filename1);
response.setHeader("Cache-Control", "max-age=" + cacheTime);
response.setContentType("application/octet-stream");
byte[] b = filename1.getBytes("GBK");
filename1 = new String(b,"8859_1");
response.setHeader("Content-Disposition", "attachment;filename=" + filename1);
response.setContentLength(filelength.intValue());
OutputStream outputStream = response.getOutputStream();
InputStream inputStream = new FileInputStream(f);
byte[] buffer = new byte[1024];
int i = -1;
while ((i = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, i);
}
outputStream.flush();
outputStream.close();
inputStream.close();
return null ;
}
}
㈡ html里input標簽里的file控制項的實現原理
不需要建立
臨時文件
,file
控制項
本身只是獲取一下你要上傳文件的路徑,至於上傳就屬於
後台
操作了。
㈢ html中input上傳圖片什麼原理啊php後台怎麼處理如果用ajax的話是傳些什麼
用input上傳圖片是把圖片作為文件傳輸的,在php後台中使用 $_FILES來接收。
注意:前端的form表單除了action ,method 屬性外,還要添加一個'enctype'屬性,否則文件傳輸不成功。
<form enctype="multipart/form-data">
<input type="file" >
</form>
$_FILES接收信息 有幾個屬性:
name , 上傳的文件名稱
size ,上傳的文件大小
tmp_name ,臨時路徑
type ,文件類型
error錯誤提示
error取值說明:
( 0:沒問題。1/2:大小超過限制[1->超出php.ini限制。2->超出文件域max_file限制]。3:只上傳部分附件(不好測試)。4:沒有上傳附件)
有上傳信息時:$_FILES接收到的附件信息:
保存附件:把上傳的文件由臨時路徑保存到真實的圖片存儲的位置。
move_uploaded_file(臨時路徑名附件,真實路徑名附件)
㈣ html是怎麼和資料庫進行交互的怎麼把值傳到資料庫,或者資料庫是怎麼把值傳到頁面的
資料庫方面的東西是服務端程序員該做的事情,一般前端不需要深入了解。當然,對於一個合格的前端來說,多多了解服務端的工作原理還有很有必要的。下面我就來說說自己的理解吧。
html本身是不具備與資料庫交互的能力的,服務端一般要一個伺服器軟體,比如iis、Apache,再搭配一門服務端的語言,比如java、php等,與資料庫的交互是通過服務端語言進行的,服務端語言通過向資料庫發送sql指令完成數據的增刪改查等工作,如果是讀取數據,就把讀取到的數據經過一定的處理後返回html頁面。過程大致如此,有不理解的可以繼續交流。
㈤ http中上傳文件的原理
http中上傳文件的原理如下:
在最初的http協議中,沒有上傳文件方面的功能。 rfc1867 ( http://www.ietf.org/rfc/rfc1867.txt ) 為 http 協議添加了這個功能。客戶端的瀏覽器,如 Microsoft IE, Mozila, Opera 等,按照此規范將用戶指定的文件發送到伺服器。伺服器端的網頁程序,如 php, asp, jsp 等,可以按照此規范,解析出用戶發送來的文件。Microsoft IE, Mozila, Opera 已經支持此協議,在網頁中使用一個特殊的 form 就可以發送文件。絕大部分 http server ,包括 tomcat ,已經支持此協議,可接受發送來的文件。各種網頁程序,如 php, asp, jsp 中,對於上傳文件已經做了很好的封裝。
超文本傳輸協議(HTTP,HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網路協議。所有的WWW文件都必須遵守這個標准。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。1960年美國人Ted Nelson構思了一種通過計算機處理文本信息的方法,並稱之為超文本(hypertext),這成為了HTTP超文本傳輸協議標准架構的發展根基。