当前位置:首页 » 文件管理 » form文件上传

form文件上传

发布时间: 2022-01-13 16:43:40

⑴ form 在上传文件时用enctype字段有什么用处

FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是“application/x-www-form-urlencoded”。

这种编码方式在表单发送之前都会将内容进行urlencode 编码。(空格转换为“+”,特殊字符转化为ASCII的HEX值)。

比如我们在表单域中的

firstname填入 bb ,,

最后发送之前得到的结果就是: bb+%2C%2C

然而,在向服务器发送大量的文本、包含非ASCII字符的文本或二进制数据时这种编码方式效率很低。

在文件上载时,所使用的编码类型应当是“multipart/form-data”,它既可以发送文本数据,也支持二进制数据上载。

浏览器端<form>表单的ENCTYPE属性值为multipart/form-data,它告诉我们传输的数据要用到多媒体传输协议,由于多媒体传输的都是大量的数据,所以规定上传文件必须是post方法,<input>的type属性必须是file。

⑵ 如何使用multipart/form-data格式上传文件

在网络编程过程中需要向服务器上传文件。Multipart/form-data是上传文件的一种方式。

Multipart/form-data其实就是浏览器用表单上传文件的方式。最常见的情境是:在写邮件时,向邮件后添加附件,附件通常使用表单添加,也就是用multipart/form-data格式上传到服务器。


表单形式上传附件

具体的步骤是怎样的呢?

首先,客户端和服务器建立连接(TCP协议)。

第二,客户端可以向服务器端发送数据。因为上传文件实质上也是向服务器端发送请求。

第三,客户端按照符合“multipart/form-data”的格式向服务器端发送数据。

既然Multipart/form-data格式就是浏览器用表单提交数据的格式,我们就来看看文件经过浏览器编码后是什么样子。

这行指出这个请求是“multipart/form-data”格式的,且“boundary”是 “---------------------------7db15a14291cce”这个字符串。

不难想象,“boundary”是用来隔开表单中不同部分数据的。例子中的表单就有 2 部分数据,用“boundary”隔开。“boundary”一般由系统随机产生,但也可以简单的用“-------------”来代替。

实际上,每部分数据的开头都是由"--" + boundary开始,而不是由 boundary 开始。仔细看才能发现下面的开头这段字符串实际上要比 boundary 多了个 “--”

紧接着 boundary 的是该部分数据的描述。

接下来才是数据。


“GIF”gif格式图片的文件头,可见,unknow1.gif确实是gif格式图片。

在请求的最后,则是 "--" + boundary + "--" 表明表单的结束。

需要注意的是,在html协议中,用 “ ” 换行,而不是 “ ”。

下面的代码片断演示如何构造multipart/form-data格式数据,并上传图片到服务器。

//---------------------------------------

// this is the demo code of using multipart/form-data to upload text and photos.

// -use WinInet APIs.

//

//

// connection handlers.

//

HRESULT hr;

HINTERNET m_hOpen;

HINTERNET m_hConnect;

HINTERNET m_hRequest;

//

// make connection.

//

...

//

// form the content.

//

std::wstring strBoundary = std::wstring(L"------------------");

std::wstring wstrHeader(L"Content-Type: multipart/form-data, boundary=");

wstrHeader += strBoundary;

HttpAddRequestHeaders(m_hRequest, wstrHeader.c_str(), DWORD(wstrHeader.size()), HTTP_ADDREQ_FLAG_ADD);

//

// "std::wstring strPhotoPath" is the name of photo to upload.

//

//

// uploaded photo form-part begin.

//

std::wstring strMultipartFirst(L"--");

strMultipartFirst += strBoundary;

strMultipartFirst += L" Content-Disposition: form-data; name="pic"; filename=";

strMultipartFirst += L""" + strPhotoPath + L""";

strMultipartFirst += L" Content-Type: image/jpeg ";

//

// "std::wstring strTextContent" is the text to uploaded.

//

//

// uploaded text form-part begin.

//

std::wstring strMultipartInter(L" --");

strMultipartInter += strBoundary;

strMultipartInter += L" Content-Disposition: form-data; name="status" ";

std::wstring wstrPostDataUrlEncode(CEncodeTool::Encode_Url(strTextContent));

// add text content to send.

strMultipartInter += wstrPostDataUrlEncode;

std::wstring strMultipartEnd(L" --");

strMultipartEnd += strBoundary;

strMultipartEnd += L"-- ";

//

// open photo file.

//

// ws2s(std::wstring)

// -transform "strPhotopath" from unicode to ansi.

std::ifstream *pstdofsPicInput = new std::ifstream;

pstdofsPicInput->open((ws2s(strPhotoPath)).c_str(), std::ios::binary|std::ios::in);

pstdofsPicInput->seekg(0, std::ios::end);

int nFileSize = pstdofsPicInput->tellg();

if(nPicFileLen == 0)

{

return E_ACCESSDENIED;

}

char *pchPicFileBuf = NULL;

try

{

pchPicFileBuf = new char[nPicFileLen];

}

catch(std::bad_alloc)

{

hr = E_FAIL;

}

if(FAILED(hr))

{

return hr;

}

pstdofsPicInput->seekg(0, std::ios::beg);

pstdofsPicInput->read(pchPicFileBuf, nPicFileLen);

if(pstdofsPicInput->bad())

{

pstdofsPicInput->close();

hr = E_FAIL;

}

delete pstdofsPicInput;

if(FAILED(hr))

{

return hr;

}

// Calculate the length of data to send.

std::string straMultipartFirst = CEncodeTool::ws2s(strMultipartFirst);

std::string straMultipartInter = CEncodeTool::ws2s(strMultipartInter);

std::string straMultipartEnd = CEncodeTool::ws2s(strMultipartEnd);

int cSendBufLen = straMultipartFirst.size() + nPicFileLen + straMultipartInter.size() + straMultipartEnd.size();

// Allocate the buffer to temporary store the data to send.

PCHAR pchSendBuf = new CHAR[cSendBufLen];

memcpy(pchSendBuf, straMultipartFirst.c_str(), straMultipartFirst.size());

memcpy(pchSendBuf + straMultipartFirst.size(), (const char *)pchPicFileBuf, nPicFileLen);

memcpy(pchSendBuf + straMultipartFirst.size() + nPicFileLen, straMultipartInter.c_str(), straMultipartInter.size());

memcpy(pchSendBuf + straMultipartFirst.size() + nPicFileLen + straMultipartInter.size(), straMultipartEnd.c_str(), straMultipartEnd.size());

//

// send the request data.

//

HttpSendRequest(m_hRequest, NULL, 0, (LPVOID)pchSendBuf, cSendBufLen)

⑶ 如何不用form上传文件

ta charset="UTF-8">
<meta name="Generator" content="EditPlus�0�3">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
<!-- <form method="post" action="" enctype="multipart/form-data">
<input type="file" id="f2">
<input type="submit" name="submit">
</form> -->

<input type="text">

⑷ form表单怎么能直接提交ftp服务器上,把文件上传到ftp服务器上!

没办法直接传的!
你只能用表单先传到web服务器上,
然后再从web服务器上传到FTP上!(可以自己写一个服务程序)

⑸ 支持文件上传的html表单

/可以理解为关闭符号,关闭的是input name ="myfile"type="file"
input是可以不用关闭的
tmp是 temporal 暂时的
dir是 directory 目录
都是变量名,不必纠结

⑹ asp.net开发,form表单,file文件上传

除了改变上传文件大小还要改变时间限制
<httpRuntime>
executionTimeout= "120 " //允许上传文件最大等待时间
maxRequestLength= "20480000 " //上传文件大小
</httpRuntime>
上传文件大小是由上面两个参数所决定的. 涉及到安全因素,最好不要设得太大.

⑺ form提交后台上传文件,为什么得不到文件内容

application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。
multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分,上传附件用到
text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。
enctype="multipart/form-data是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form- data,才能完整的传递文件数据,进行下面的操作.

别人的一个例子:
form中加入enctype="multipart/form-data"时整个表单被封装,字符将转成二进制流,因此request.getParameter("user_type")是得不到值的.给段实例做参考:
SmartUpload su = new SmartUpload();
su.initialize(pageContext);
su.upload();
String strzy=su.getRequest().getParameter("user_type");
这样就行了

⑻ 上传文件form表单为什么提交不了后台

text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。
enctype="multipart/form-data是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form- data,才能完整的传递文件数据,进行下面的操作.

别人的一个例子:
form中加入enctype="multipart/form-data"时整个表单被封装,字符将转成二进制流,因此request.getParameter("user_type")是得不到值的.给段实例做参考:
SmartUpload su = new SmartUpload();
su.initialize(pageContext);
su.upload();
String strzy=su.getRequest().getParameter("user_type");
这样就行了

⑼ 怎么在form里分别上传多个文件,如图

可以用iframe上传,orm表单的method、 enctype属性必须和下面代码一样。然后将target的值设为iframe的name,这样就可以实现无刷新上传文件。
<form action="uploadfile.php" enctype="multipart/form-data" method="post" target="iframeUpload">
<iframe name="iframeUpload" src="" width="350" height="35" frameborder=0 SCROLLING="no" style="display:NONE"></iframe>
<input id="test_file" name="test_file" type="file">
<input value="上传文件" type="submit">
</form>

⑽ 如何用FormData实现多文件上传

可以用数组形式,我贴代码了
html 部分
<li class="list-group-item disabled select-file-div">
<input type="file" multiple="true" class="input-sm clear-l-r-padding select-file" data-uploadtype="photo"/>
</li>
js部分
var i,
data = new FormData();
...
for (i = 0; i < $('.select-file').files.length; i++) {
data.append('file[]', this.files[i]);
}
...//省略代码若干...在选择完成后调用下面$.ajax$.ajax({
url: 'url'
type: "POST",
data: data,
dataType: 'json',
processData: false,// *重要,确认为false
contentType: false,
beforeSend: function () {
... },
success: function (res) {
console.log(res);
},
error: function (res) {
...}
});
php 部分 接收数组
$fileField='file';
$name = $_FILES$fileField;
$tmp_name = $_FILES[$fileField]['tmp_name'];
$size = $_FILES[$fileField]['size'];
$error = $_FILES[$fileField]['error'];
/ 如果是多个文件上传则$file["name"]会是一个数组 /
if(is_Array($name)){
$errors=array();
/多个文件上传则循环处理 , 这个循环只有检查上传文件的作用,并没有真正上传 /
for($i = 0; $i < count($name); $i++){
/设置文件信息 /
if($this->setFiles($name[$i],$tmp_name[$i],$size[$i],$error[$i] )) {
if(!$this->checkFileSize() || !$this->checkFileType()){
$errors[] = $this->getError();
$return=false;
}
}else{
$errors[] = $this->getError();
$return=false;
}
/ 如果有问题,则重新初使化属性 /
if(!$return)
$this->setFiles();
}

热点内容
缓存行原理 发布:2024-11-14 13:08:56 浏览:432
简单的vb编程 发布:2024-11-14 13:06:45 浏览:523
绿色linux 发布:2024-11-14 12:56:11 浏览:350
游戏本缓存 发布:2024-11-14 12:55:28 浏览:650
微软提供的编译软件 发布:2024-11-14 12:55:16 浏览:18
长沙java培训机构哪家好 发布:2024-11-14 12:40:53 浏览:229
外存储器硬盘能存储的高清电影数 发布:2024-11-14 12:33:23 浏览:266
python分号作用 发布:2024-11-14 12:31:50 浏览:224
方舟编译器下载要钱吗 发布:2024-11-14 12:29:20 浏览:63
jspoa源码 发布:2024-11-14 12:21:31 浏览:421