그러나 어떤 경우에는 몇 개의 파일만 전달하면 되며 파일 크기가 너무 크지 않습니다. 이 경우 구성 요소를 사용하는 것은 약간 과한 작업입니다. HTML과 함께 제공됩니다. 필요한 기능을 구현하는 열쇠는 백그라운드 수신 프로그램의 처리에 있습니다.
PHP는 업로드를 매우 편리하게 처리합니다. 업로드된 파일 정보는 서버를 통해 자동으로 $_FILES 배열로 처리됩니다. 개발자는 간단한 작업을 수행하기 위해 내장된 처리 기능만 사용하면 됩니다. ASP 개발자는 그렇게 운이 좋지 않습니다. 공식에서는 직접 처리 방법을 제공하지 않으며 개발자가 직접 설계해야 합니다. 이때 개발자는 IIS가 enctype="multipart/form-data" 형식을 처리하는 방법을 이해해야 합니다. enctype= "multipart/form-data" 형식으로 제출된 데이터는 바이너리 데이터로 저장되어 바이너리 형식으로 개발자에게 반환됩니다. 개발자는 획득한 업로드 콘텐츠와 이를 분석하기 위해 LenB 및 MidB의 바이트 처리 기능을 사용해야 합니다. 클라이언트가 보낸 특정 양식의 데이터 형식에 대해서는 HTTP RFC1867 프로토콜 전송 형식에 대해 알아볼 수 있습니다.
다음은 PHP 및 ASP 버전을 포함하여 여러 파일 업로드를 처리하는 방법입니다.
php: WEBSITE_DIRROOT는 웹 사이트 루트 디렉터리를 나타냅니다.
코드 복사 코드는 다음과 같습니다.
/*
* 클래스: 文件上传类
* 작성자: 51JS.COM-ZMM
* 날짜: 2011.1.20
* 이메일: 304924248@qq.com
* 블로그: http://www.cnblogs.com/cnzmm/
*/
class Upload {
public $up_ext=array(), $up_max=5210, $up_dir;
비공개 $up_name, $up_rename=true, $up_num=0, $up_files=array(), $up_ret=array();
function __construct($name, $ext=array(), $rename=true) {
if (!empty($name)) {
$this->up_name = $name;
!empty($ext) && $this->up_ext = $ext;
$this->up_rename = $rename;
$this->up_dir = WEBSITE_DIRROOT.
$GLOBALS['cfg_upload_path'];
$this->InitUpload();
} else {
exit('upload文件域name称为空,初始化失败!');
}
}
비공개 함수 InitUpload() {
if (is_array($_FILES[$this->up_name])) {
$up_arr = count($_FILES[$this ->up_name]);
$up_all = count($_FILES[$this->up_name], 1);
$up_cnt = ($up_all - $up_arr) / $up_arr;
for ($i = 0; $i if ($_FILES[$this->up_name]['error'][$i] != 4) {
$this->up_files[] = 배열(
'tmp_name' => $_FILES[$this->up_name]['tmp_name'][$i],
'name' = > $_FILES[$this->up_name]['이름'][$i],
'유형' => $_FILES[$this->up_name]['유형'][$i] ,
'크기' => $_FILES[$this->up_name]['크기'][$i],
'오류' => $_FILES[$this->up_name][ '오류'][$i]
);
}
}
$this->up_num = count($this->up_files);
} else {
if (isset($_FILES[$this->up_name])) {
$this->up_files = array(
'tmp_name' => $_FILES[ $this->up_name]['tmp_name'],
'name' => $_FILES[$this->up_name]['name'],
'type' => $this->up_name]['유형'],
'크기' => $_FILES[$this->up_name]['크기'],
'오류' => $this->up_name]['오류']
);
$this->up_num = 1;
} else {
exit('没找找到需要upload的文件!');
}
}
$this->ChkUpload();
}
비공개 함수 ChkUpload() {
if (empty($this->up_ext)) {
$up_mime = array('image/wbmp', 'image/bmp', ' 이미지/gif', '이미지/pjpeg', '이미지/x-png');
foreach($this->up_files를 $up_file로) {
$up_allw = false;
foreach ($up_mime as $mime) {
if ($up_file['type'] == $mime) {
$up_allw = true; 부서지다;
}
}
!$up_allw &&exit('不允许上传'.$up_file['type'].'格式的文件!');
if ($up_file['size'] / 1024 > $this->up_max) {
exit('不允许上传大于 '.$this->up_max.'K 的文件!') ;
}
}
} else {
foreach ($this->up_files as $up_file) {
$up_ext = end(explode('.', $up_file['name') ]));
$up_allw = 거짓;
foreach ($this->up_ext as $ext) {
if ($up_ext == $ext) {
$up_allw = true; 부서지다;
}
}
!$up_allw &&exit('不允许上传.'.$up_ext.'格式的文件!');
if ($up_file['size'] / 1024 > $this->up_max) {
exit('不允许上传大于 '.$this->up_max.'K 的文件!') ;
}
}
}
$this->Uploading();
}
비공개 함수 Uploading() {
if (IO::DIRCreate($this->up_dir)) {
if (chmod($this->up_dir, 0777)) {
if (!empty($this->up_files)) {
foreach ($this->up_files as $up_file) {
if (is_uploaded_file($up_file['tmp_name'])) {
$file_name = $up_file['이름'];
if ($this->up_rename) {
$file_ext = end(explode('.', $file_name));
$file_rnd = substr(md5(uniqid()), mt_rand(0, 26), 6);
$file_name = 날짜('ymdHis').'_'.$file_rnd.'.'.$file_ext;
}
$file_name = $this->up_dir.'/'.$file_name;
if (move_uploaded_file($up_file['tmp_name'], $file_name)) {
$this->up_ret[] = str_replace(WEBSITE_DIRROOT, '', $file_name);
} else {
exit('文件上传失败!');
}
}
}
}
} else {
exit('未开启写入权限!');
}
} else {
exit('上传目录创建失败!');
}
}
공용 함수 GetUpload() {
return empty($this->up_ret) ? 거짓 : $this->up_ret;
}
함수 __destruct() {}
}
?>
复代码 代码如下:
<%
Class MultiUpload
REM PUBLIC-VARIANT
Public Form, IsFinished
Private bVbCrlf, bSeparate, fPassed, formData, fileType, fileSize, folderPath, _
fRename, fIMGOnly, itemCount, chunkSize, bTime, sErrors, sAuthor, sVersion
Private itemStart(), itemLength(), dataStart(), dataLength(), itemName(), itemData(), extenArr(), httpArr()
REM CLASS-INITIALIZE
Private Sub Class_Initialize
Call InitVariant
Server.ScriptTimeOut = 1800
Set Form = Server.CreateObject("Scripting.Dictionary")
sAuthor = "51JS.COM-ZMM"
sVersion = "MultiUpload Class 3.0"
End Sub
REM CLASS-ATTRIBUTES
Public Property Let AllowType(byVal sType)
Dim regEx
Set regEx = New RegExp
regEx.Pattern = "^(\w+\|)*\w+$"
regEx.Global = False
regEx.IgnoreCase = True
If regEx.Test(sType) Then fileType = "|" & Ucase(sType) & "|"
Set regEx = Nothing
End Property
Public Property Let MaxSize(byVal sSize)
If IsNumeric(sSize) Then fileSize = CDbl(FormatNumber(CCur(sSize), 2))
End Property
Public Property Let SaveFolder(byVal sFolder)
folderPath = sFolder
End Property
Public Property Let CommonPassed(byVal bCheck)
fPassed = bCheck
End Property
Public Property Let FileRenamed(byVal bRename)
fRename = bRename
End Property
Public Property Let FileIsAllImg(byVal bOnly)
fIMGOnly = bOnly
End Property
Public Property Get SaveFolder
SaveFolder = folderPath
End Property
Public Property Get FileRenamed
FileRenamed = fRename
End Property
Public Property Get FileIsAllImg
FileIsAllImg = fIMGOnly
End Property
Public Property Get ErrMessage
ErrMessage = sErrors
End Property
Public Property Get ClsAuthor
ClsAuthor = sAuthor
End Property
Public Property Get ClsVersion
ClsVersion = sVersion
End Property
REM CLASS-METHODS
Private Function InitVariant
IsFinished = False
bVbCrlf = StrToByte(vbCrlf & vbCrlf)
bSeparate = StrToByte(String(29, "-"))
fPassed = False
fileType = "*"
fileSize = "*"
fRename = True
fIMGOnly = True
itemCount = 0
chunkSize = 1024 * 128
bTime = Now
sErrors = ""
End Function
Public Function GetUploadData
Dim curRead : curRead = 0
Dim dataLen : dataLen = Request.TotalBytes
Dim appName : appName = "PROGRESS" & IPToNum(GetClientIPAddr)
Dim streamTmp
Set streamTmp = Server.CreateObject("ADODB.Stream")
streamTmp.Type = 1
streamTmp.Open
Do While curRead < dataLen
Dim partLen : partLen = chunkSize
If partLen + curRead > dataLen Then partLen = dataLen - curRead
streamTmp.Write Request.BinaryRead(partLen)
curRead = curRead + partLen
LetProgress appName, Array(curRead, dataLen, DateDiff("s", bTime, Now), folderPath)
Loop
streamTmp.Position = 0
formData = streamTmp.Read(dataLen)
streamTmp.Close
Set streamTmp = Nothing
Call ItemPosition
End Function
Private Function LetProgress(byVal sName, byVal vArr)
Application.Value(sName) = Join(vArr, "|")
End Function
Private Function DelProgress
Application.Contents.Remove("PROGRESS" & IPToNum(GetClientIPAddr))
End Function
Private Function ItemPosition
Dim iStart, iLength : iStart = 1
Do Until InStrB(iStart, formData, bSeparate) = 0
iStart = InStrB(iStart, formData, bSeparate) + LenB(bSeparate) + 14
iLength = InStrB(iStart, formData, bSeparate) - iStart - 2
If Abs(iStart + 2 - LenB(formData)) > 2 Then
ReDim Preserve itemStart(itemCount)
ReDim Preserve itemLength(itemCount)
itemStart(itemCount) = iStart
itemLength(itemCount) = iLength
itemCount = itemCount + 1
End If
Loop
Call FillItemValue
End Function
Private Function FillItemValue
Dim dataPart, bInfor
Dim iStart : iStart = 1
Dim iCount : iCount = 0
Dim iCheck : iCheck = StrToByte("filename")
For i = 0 To itemCount - 1
ReDim Preserve itemName(iCount)
ReDim Preserve itemData(iCount)
ReDim Preserve extenArr(iCount)
ReDim Preserve httpArr(iCount)
ReDim Preserve dataStart(iCount)
ReDim Preserve dataLength(iCount)
dataPart = MidB(formData, itemStart(i), itemLength(i))
iStart = InStrB(1, dataPart, ChrB(34)) + 1
iLength = InStrB(iStart, dataPart, ChrB(34)) - iStart
itemName(iCount) = GetItemName(MidB(dataPart, iStart, iLength))
iStart = InStrB(1, dataPart, bVBCrlf) + 4
iLength = LenB(dataPart) - iStart + 1
If InStrB(1, dataPart, iCheck) > 0 Then
bInfor = MidB(dataPart, 1, iStart - 5)
extenArr(iCount) = FileExtenName(bInfor)
httpArr(iCount) = GetHttpContent(bInfor)
If IsNothing(extenArr(iCount)) Then
itemData(iCount) = ""
dataStart(iCount) = ""
dataLength(iCount) = ""
Else
If Mid(folderPath, Len(folderPath) - 1) = "/" Then
If fRename Then
itemData(iCount) = folderPath & GetRandomName(6) & extenArr(iCount)
Else
itemData(iCount) = folderPath & GetClientName(bInfor) & extenArr(iCount)
End If
Else
If fRename Then
itemData(iCount) = folderPath & "/" & GetRandomName(6) & extenArr(iCount)
Else
itemData(iCount) = folderPath & "/" & GetClientName(bInfor) & extenArr(iCount)
End If
End If
dataStart(iCount) = itemStart(i) + iStart - 2
dataLength(iCount) = iLength
End If
Else
extenArr(iCount) = ""
httpArr(iCount) = ""
itemData(iCount) = ByteToStr(MidB(dataPart, iStart, iLength))
dataStart(iCount) = ""
dataLength(iCount) = ""
End If
iCount = iCount + 1
Next
Call ItemToColl
End Function
Private Function GetItemName(byVal bName)
GetItemName = ByteToStr(bName)
End Function
Private Function ItemToColl
For i = 0 To itemCount - 1
If Not Form.Exists(itemName(i)) Then
Form.Add itemName(i), itemData(i)
End If
Next
End Function
Private Function FileExtenName(byVal bInfor)
Dim pContent, regEx
pContent = GetClientPath(bInfor)
If IsNothing(pContent) Then
FileExtenName = ""
Else
Set regEx = New RegExp
regEx.Pattern = "^.+(\.[^\.]+)$"
regEx.Global = False
regEx.IgnoreCase = True
FileExtenName = regEx.Replace(pContent, "$1")
Set regEx = Nothing
End If
End Function
Private Function GetHttpContent(byVal bInfor)
Dim sInfor, regEx
sInfor = ByteToStr(bInfor)
Set regEx = New RegExp
regEx.Pattern = "^[\S\s]+Content-Type:([\S\s]+)$"
regEx.Global = False
regEx.IgnoreCase = True
GetHttpContent = Trim(regEx.Replace(sInfor, "$1"))
Set regEx = Nothing
End Function
Private Function GetRandomName(byVal sLen)
Dim regEx, sTemp, arrFields, n : n = 0
Set regEx = New RegExp
regEx.Pattern = "[^\d]+"
regEx.Global = True
regEx.IgnoreCase = True
sTemp = regEx.Replace(Now, "") & "-"
Set regEx = Nothing
arrFields = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", _
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", _
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t", _
"u", "v", "w", "x", "y", "z", "A", "B", "C", "D", _
"E", "F", "G", "H", "I", "J", "K", "L", "M", "N", _
"O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", _
"Y", "Z")
Randomize
Do While n < sLen
sTemp = sTemp & CStr(arrFields(61 * Rnd))
n = n + 1
Loop
GetRandomName = sTemp
End Function
Private Function GetClientName(byVal bInfor)
Dim pContent, regEx
pContent = GetClientPath(bInfor)
If IsNothing(pContent) Then
GetClientName = ""
Else
Set regEx = New RegExp
regEx.Pattern = "^.*\\([^\.]*)[^\\]+$"
regEx.Global = False
regEx.IgnoreCase = True
GetClientName = regEx.Replace(pContent, "$1")
Set regEx = Nothing
End If
End Function
Private Function GetClientPath(byVal bInfor)
Dim sInfor, pStart, pLength, pContent
sInfor = ByteToStr(bInfor)
pStart = InStr(1, sInfor, "filename=" & Chr(34)) + 10
pLength = InStr(pStart, sInfor, Chr(34)) - pStart
pContent = Mid(sInfor, pStart, pLength)
GetClientPath = pContent
End Function
Public Function SaveUploadFile
Dim isValidate
Dim filePath, oStreamGet, oStreamPut
isValidate = fPassed And CheckFile
If isValidate Then
For i = 0 To itemCount - 1
If Not IsNothing(dataStart(i)) And Not IsNothing(dataLength(i)) Then
If dataLength(i) = 0 Then
itemData(i) = ""
Else
filePath = Server.MapPath(itemData(i))
If CreateFolder("|", ParentFolder(filePath)) Then
Set oStreamGet = Server.CreateObject("ADODB.Stream")
oStreamGet.Type = 1
oStreamGet.Mode = 3
oStreamGet.Open
oStreamGet.Write formData
oStreamGet.Position = dataStart(i)
Set oStreamPut = Server.CreateObject("ADODB.Stream")
oStreamPut.Type = 1
oStreamPut.Mode = 3
oStreamPut.Open
oStreamPut.Write oStreamGet.Read(dataLength(i))
oStreamPut.SaveToFile filePath, 2
oStreamGet.Close
Set oStreamGet = Nothing
oStreamPut.Close
Set oStreamPut = Nothing
End If
End If
End If
Next
IsFinished = True
Else
IsFinished = False
End If
End Function
Private Function CheckFile
Dim oBoolean : oBoolean = True
CheckFile = oBoolean And CheckType And CheckSize
End Function
Private Function CheckType
Dim oBoolean : oBoolean = True
If fileType = "*" Then
oBoolean = oBoolean And True
Else
For i = 0 To itemCount - 1
If Not IsNothing(extenArr(i)) Then
If InStr(1, fileType, "|" & Ucase(Mid(extenArr(i), 2)) & "|") > 0 Then
If fIMGOnly Then
Dim sAllow : sAllow = "|GIF|PJPEG|X-PNG|BMP|"
Dim aCheck : aCheck = Split(UCase(httpArr(i)), "/")
Dim iCheck : iCheck = "|" & aCheck(Ubound(aCheck)) & "|"
If InStr(1, sAllow, iCheck, 1) > 0 Then
oBoolean = oBoolean And True
Else
sErrors = sErrors & "[ " & itemName(i) & " ] 양식의 파일 형식이 잘못되었습니다! n" & _
"지원되는 형식은 다음과 같습니다: " & 바꾸기 ( Mid(fileType, 2, Len(fileType) - 1), "|", " ") & "nn"
oBoolean = oBoolean And False
End If
Else
oBoolean = oBoolean And True
End If
Else
sErrors = sErrors & "[ " & itemName(i) & " ] 양식의 파일 형식이 잘못되었습니다! n" & _
"지원되는 형식은 " & 바꾸기( Mid(fileType, 2, Len(fileType) - 1), "|", " ") & "nn"
oBoolean = oBoolean And False
End If
End If
Next
End If
CheckType = oBoolean
End Function
Private Function CheckSize
Dim oBoolean : oBoolean = True
If fileSize = "*" Then
oBoolean = oBoolean And True
Else
For i = 0 To itemCount - 1
If Not IsNothing(dataLength(i)) Then
Dim tmpSize : tmpSize = CDbl(FormatNumber(CCur(dataLength(i)) / 1024, 2) )
If tmpSize <= fileSize Then
oBoolean = oBoolean And True
Else
sErrors = sErrors & "양식의 파일 크기 [ " & itemName(i) & " ] (" & tmpSize & " KB )가 범위를 벗어났습니다! n" & _
"지원되는 크기 범위: <= " & fileSize & " KBnn"
oBoolean = oBoolean And False
End If
End If
Next
End If
CheckSize = oBoolean
End Function
Private Function CreateFolder(byVal sLine, byVal sPath)
Dim oFso
Set oFso = Server.CreateObject("Scripting.FileSystemObject" )
oFso.FolderExists(sPath)가 아닌 경우
Dim regEx
Set regEx = New RegExp
regEx.Pattern = "^(.*)\([^\]*)$"
regEx .Global = False
regEx.IgnoreCase = True
sLine = sLine & regEx.Replace(sPath, "$2") & "|"
sPath = regEx.Replace(sPath, "$1" )
If CreateFolder(sLine, sPath) Then CreateFolder = True
Set regEx = Nothing
Else
If sLine = "|" Then
CreateFolder = True
Else
Dim sTemp : sTemp = Mid(sLine, 2, Len(sLine) - 2)
If InStrRev(sTemp, "|") = 0 Then
sLine = "|"
sPath = sPath & "" & sTemp
Else
Dim 폴더 : 폴더 = Mid(sTemp, InStrRev(sTemp, "|") 1)
sLine = "|" & Mid(sTemp, 1, InStrRev(sTemp, "|") - 1) & "|"
sPath = sPath & "" & Folder
End If
oFso.CreateFolder sPath
If CreateFolder(sLine, sPath) Then CreateFolder = True
End if
End If
Set oFso = Nothing
End Function
Private Function ParentFolder(byVal sPath)
Dim regEx
Set regEx = New RegExp
regEx.Pattern = "^(. *)\ [^\]*$"
regEx.Global = True
regEx.IgnoreCase = True
ParentFolder = regEx.Replace(sPath, "$1")
regEx = Nothing <🎜 설정 >끝 함수
개인 함수 IsNothing(byVal sVar)
IsNothing = CBool(sVar = 비어 있음)
끝 함수
개인 함수 StrPadLeft(byVal sText, byVal sLen, byVal sChar)
Dim sTemp : sTemp = sText
Do While Len(sTemp) < sLen : sTemp = sChar & sTemp : Loop
StrPadLeft = sTemp
End Function
Private Function StrToByte(byVal sText)
For i = 1 To Len(sText)
StrToByte = StrToByte & ChrB(Asc(Mid(sText, i, 1)))
다음
끝 함수
개인 함수 ByteToStr(byVal sByte)
Dim oStream
Set oStream = Server.CreateObject("ADODB.Stream")
oStream.Type = 2
oStream.Mode = 3
oStream.Open
oStream.WriteText sByte
oStream.Position = 0
oStream.CharSet = "gb2312"
oStream.Position = 2
ByteToStr = oStream.ReadText
oStream.Close
Set oStream = Nothing
함수 종료
private function getClientipAddr
if is nothing (getervervar ( "http_x_forwarded_for")와 <🎜 🎜 🎜 🎜 getclientipaddr = getservervar ( "remote_addr") <🎜 🎜 els
함수 종료
프라이빗 함수 GetServerVar(byVal sText)
GetServerVar = Request.ServerVariables(sText)
함수 종료
프라이빗 함수 IPToNum(byVal sIp)
Dim sIp_1, sIp_2, sIp_3 , sIp_4
If IsNumeric(Left(sIp, 2)) Then
sIp_1 = Left(sIp, InStr(sIp, ".") - 1)
sIp = Mid(sIp, InStr(sIp, " .") 1)
sIp_2 = 왼쪽(sIp, InStr(sIp, ".") - 1)
sIp = Mid(sIp, InStr(sIp, ".") 1)
sIp_3 = 왼쪽 (sIp, InStr(sIp, ".") - 1)
sIp_4 = Mid(sIp, InStr(sIp, ".") 1)
End If
IPToNum = CInt(sIp_1) * 256 * 256 * 256 CInt(sIp_2) * 256 * 256 CInt(sIp_3) * 256 CInt(sIp_4) - 1
끝 함수
REM CLASS-TERMINATE
Private Sub Class_Terminate
DelProgress 호출
양식 .RemoveAll
Set Form = Nothing
End Sub
End Class
%>
위 내용은 파일 전송 프로토콜의 내용을 포함하여 일반적인 형태의 다중 파일 업로드를 위한 파일 전송 프로토콜 PHP 처리 방법을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.