文件管理 · 2022年8月21日

formidable文件上传|nodejs怎样获取一个上传文件的MD5码

1. formidable 判断是否有文件上传

【formidable】 adj. 强大的;可怕的;令人敬畏的;艰难的;使人敬畏的;令人惊叹的;庞大的;优秀的,杰出的;难对付的,难以克服的… 同义有–powerful, terrible, august, horrible … 【dreadful 】 adj. 1. 可怕的,可怖的,可畏的,令人(感到)恐惧的;令人惊骇的,骇人的 2. 令人敬畏的 3. [口语]极不合意的,令人作呕的,令人不快的;糟透了的;极讨厌的;丑陋的;可恶的 4. 极其严重的;极大的;极端的 (有 比较级more dreadful 最高级most dreadful ) 读音不同,部分词义不同》 以上回答,希望能解决你的问题。递交。

2. nodejs怎样获取一个上传文件的MD5码

MD5中的MD代表 Digest,就是信息摘要的意思,不过这个信息摘要不是信息内容的缩写,而是根据公开的MD5算法对原信息进行数学变换后得到的一个128位(bit)的特征码。1、D5就是求字符串的md5,文件就是一个字符串;2、前台目前就别考虑读文件内容了(大部分浏览器不行) 都让后台做;可以直接看nodeclub源代码,如下:var crypto = require('crypto');exports.encrypt = function (str, secret) {var cipher = crypto.createCipher('aes192’, secret);var enc = cipher.update(str, 'utf8’, ‘hex’);enc += cipher.final(‘hex’);return enc;};exports.decrypt = function (str, secret) {var decipher = crypto.createDecipher('aes192’, secret);var dec = decipher.update(str, 'hex’, ‘utf8’);dec += decipher.final(‘utf8’);return dec;};exports.md5 = function (str) {var md5sum = crypto.createHash(‘md5’);md5sum.update(str);str = md5sum.digest(‘hex’);return str;};exports.randomString = function (size) {size = size || 6;var code_string = '’;var max_num = code_string.length + 1;var new_pass = '’;while (size > 0) {new_pass += code_string.charAt(Math.floor(Math.random() * max_num));size–;}return new_pass;};

3. nodejs后台,用formidable处理上传文件时,前台需要传什么参数给后端

用一个表单<form method="post" enctype="multipart/form-data" action="/file-upload"> <input type="file" name="thumbnail"> <input type="submit"></form>这样就可以了

4. 使用formidable上传文件,文件为空.请问是怎么回事

1、可以在内存存储所有文件的MD5值。具体的可以生成一个Map,key值为MD5,value为文件路径。当上传文件时,查看该文件的md5值是否存在于内存的Map,若不存在,则上传文件,同时更新该Map,将该文件存于Map中。否则不需要上传。 2、socket.io采用事件驱动。所以文件的上传的连接、结束以及传送数据都可以作为一个事件来处理。具体的处理可以看下formidable模块。

5. nodejs npm安装的模块 该怎么使用

写java代码,遇到问题首先去找相关的第三方APi,已经成为习惯了,java的第三方api真的是太多了。不过也不用羡慕java,node.js也不少,看看官网的介绍:

官方文档的最下面Appendix 1: Recommended Third-party Moles,这里是关于第三方模块的介绍,第一段:There are many third party moles for Node. At the time of writing, August 2010, the master repository of moles isthe wiki page.打开这个链接你会发现相当多的第三方模块,上百个是少不了的。

要安装使用这些模块需要使用npm(Node Package Manager)工具,该工具node.js已经集成,这个工具给我感觉像maven。打开命令行,执行npm -h(通常命令行应用程序都可以这样查看帮助,或者是/?,–help),结果如下:

不报错了,证明安装成功可以使用。关于上传代码的实现,下次再讲。

varformidable=require('formidable');

6. 基木鱼上传图片都会被压缩的很厉害,有没有什么方法可以解决

使用各类在线工具上传文件基本都有压缩的问题,解决这类问题“被动压缩不如自主压缩”,因此使用媒体方工具的时候,建议顺应媒体方的规则。设计素材时,按照平台给出的尺寸规格去做,利用web格式在保证清晰的同时自主压缩;不要做宽高尺寸过大的图片;不要使用占用内存过大的图片(推荐控制在500kb以下);压缩时可根据清晰度优选内存更小的图片格式(jpg、png、gif等)进行使用。图片上传后可以结合预览不断调试优化,优选最终展示清晰度高,上传素材失真率低的实现方式,总结起来就一句话,多试,从试错中总结经验。工作中可以选择第三方工具帮助优化,九枝兰的系统SEM和信息流方面功能都很强大,可以试试。

7. Node.js 怎么处理批量表单数组的提交

处理的方法有两种,他们是:表单数据一种是get方式, 另一种是post 方式

方法如下:

1.get方式

对于get方式,node处理起来非常简单

如以下代码:

var urlParsed = url.parse(request.url);var getData = querystring.parse(urlParsed.query); //getData 为object类型 同名表单为array

get返回结果:

{ name: "blue5tar", hobby:["read", "surfing"]}

2. post方式

post方式处理起来比较麻烦,但是有了node-formidable 这个mole 我们就省事多了

使用npm安装 node-formidable

npm install formidable

formidable 使用方法

formidable = require("formidable"); //载入 formidablevar form = new formidable.IncomingForm(); var post = {}, file = {};form.uploadDir = '/tmp'; //文件上传 临时文件存放路径 form .on('error', function(err) { console.log(err); //各种错误 }) //POST 普通数据 不包含文件 field 表单name value 表单value .on('field', function(field, value) { if (form.type == 'multipart') { //有文件上传时 enctype="multipart/form-data" if (field in post) { //同名表单 checkbox 返回array 同get处理 if (util.isArray(post[field]) === false) { post[field] = [post[field]]; } post[field].push(value); return; } } post[field] = value; }) .on('file', function(field, file) { //上传文件 file[field] = file; }) .on('end', function() { fn(); //解析完毕 做其他work });form.parse(request); //解析request对象

post方式有个bug

当form 有enctype=“multipart/form-data” 和没有 enctype=“multipart/form-data” 时 同名表单处理的方式不一样。有 enctype=“multipart/form-data” 时 同名表单会被最后一个value覆盖,没有 enctype="multipart/form-data"时,同get一样 会返回一个array

所以, 在 'field’事件时,对form.type进行不同处理 , 同名表单都返回array

还有一个问题,上传文件时 如果不选择文件 也会在临时目录生成空的临时文件, 解决办法:修改 formidable 模块 lib/incoming_form.js handlePart方法 在183行处添加:

if (part.filename == "") { return;}

上传文件返回的结构如下:

{ size: 40635, //文件大小 path: '/tmp/', //临时文件路径 name: 'arrow.png', //文件名称 type: 'image/png', //文件 mime lastModifiedDate: Sun, 11 Mar 2012 07:19:44 GMT, _writeStream: { path: '/tmp/', fd: 7, writable: false, flags: 'w', encoding: 'binary', mode: 438, bytesWritten: 40635, busy: false, _queue: [], drainable: true }, length: [Getter], //同size filename: [Getter], //同name mime: [Getter] //同type}

文件上传到临时文件目录下,我们还要将临时文件, 移到我们的上传目录中

fs.rename(file.path, global.appConfig.uploadDir + '/' + file.filename);

8. 如何通过代理使用npm install 安装

把服务器上的npm,设置代理到可以访问外网的机子上(代理工具:ccproxy、fiddler等),即可解决问题!#npm config set proxy http://proxy.company.com:8080

#npm config set https-proxy http://proxy.company.com:8080

搞到以后,删除代理设置:

#npm config delete proxy

#npm config delete https-proxy

其它详细参数:https://npmjs.org/doc/config.html附:直接给linux设置网络代理:

#export http_proxy http://proxy.company.com:8080

#export https_proxy http://proxy.company.com:8080前面日志中的例子需运行“npm install formidable”指令安装模块支持文件上传。

如果浏览器有代理服务器,或者办公环境封杀了https,则需要设置npm环境变量。

我看到的错误提示信息是这样:

npm ERR! Error: failed to fetch from registry: formidable

首先查看环境变量默认值(没准将来想设回去):

>npm config get proxynull>npm config get registry

https://registry.npmjs.org/

然后设置新值:

>npm config set registry http://registry.npmjs.vitecho.com

>npm config set proxy=http://10.2.3.4:8080 (此处代理应与浏览器代理设置相同)

如果继续安装看到下面的错误提示:

npm ERR! Please try running this command again as root/Administrator.

解决问题:“以管理员身份运行”cmd

9. 微信浏览器怎么看console.log

前端JS中使用XMLHttpRequest 2上传图片到服务器,PC端和大部分手机上都正常,但在少部分安卓手机上上传失败,服务器上查看图片,显示字节数为0。下面是上传图片的核心代码: HTML <input type="file" id="choose" capture="camera" accept="image/*"> JavaScript var filechooser = document.getElementById("choose"); filechooser.onchange = function () { var _this = $(this); if (!this.files.length) return; var files = Array.prototype.slice.call(this.files); if (files.length > 1) { alert("一次只能上传1张图片"); return; } files.forEach(function (file, i) { if (!/\/(?:jpegpnggif)/i.test(file.type)) return; var reader = new FileReader(); reader.onload = function () { var result = this.result; upload(result, file.type); }; reader.readAsDataURL(file); }); }; function upload(basestr, type){ var xhr = new XMLHttpRequest(); var text = window.atob(basestr.split(",")[1]); var buffer = new Uint8Array(text.length); var pecent = 0; for (var i = 0; i < text.length; i++) { buffer[i] = text.charCodeAt(i); } var blob = getBlob(buffer, type); var formdata = new FormData(); formdata.append('imagefile', blob); xhr.open('post', '/uploadtest'); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { var jsonData = JSON.parse(xhr.responseText); console.log(jsonData); } }; //利用progress事件显示数据发送进度 xhr.upload.addEventListener('progress', function (e) { pecent = ~~(100 * e.loaded / e.total) / 2; // 利用pecent来显示上传进度 }, false); xhr.send(formdata); } function getBlob(buffer, format){ var Builder = window.WebKitBlobBuilder window.MozBlobBuilder; if(Builder){ var builder = new Builder(); builder.append(buffer); return builder.getBlob(format); } else { return new window.Blob([ buffer ], {type: format}); } } 上述代码使用FormData来实现表单数据提交。FormData是一种针对XHR2设计的新型数据类型,使用它我们可以很方便地实时以JavaScript创建HTML <Form>,然后通过AJAX提交该表单。在上述代码中,提交的表单中的字段名为imagefile,值是blob,这是一个通过getBlob函数构造并返回的文件Blob。通过该方法上传文件简单直观。 然后我们在服务端接收并保存图片,并返回已上传的图片的信息。 下面是Node.js代码的示例: var Q = require('q'); var fs = require('fs'); var path = require('path'); var formidable = require('formidable'); var moment = require('moment');var imageUpload = function (){ }; imageUpload.prototype.useFormParseCallback = function(req){ var deferred = Q.defer(); var form = new formidable.IncomingForm(); form.parse(req, deferred.makeNodeResolver()); return deferred.promise; }; imageUpload.prototype.uploadImageTest = function(req){ var pathName = 'uploadImgs/dealInfo/'; var uploadPath = path.join(__dirname, '../../public/', pathName); return this.useFormParseCallback(req).then(function(files){ var file = files[1].imagefile; var fileType = files[1].imagefile.type.split('/')[1]; var newFileName = 'upload_' + moment().format('x') + Math.random().toString().substr(2, 10) + '.' + fileType; var readStream = fs.createReadStream(file.path); var writeStream = fs.createWriteStream(uploadPath + newFileName); var deferred = Q.defer(); readStream.pipe(writeStream); readStream.on('end', deferred.makeNodeResolver()); return deferred.promise.then(function() { fs.unlinkSync(file.path); return { fileName: newFileName, filePath: '/' + pathName + newFileName, fileSize: file.size/1024 > 1024 ? (~~(10*file.size/1024/1024))/10 + "MB" : ~~(file.size/1024) + "KB" }; }); }); }; mole.exports = imageUpload; 我们使用formidable这个包来接收上传文件的数据,然后将文件保存到/public/uploadImgs/dealInfo目录下(假定已在express中将public设置为static的根目录),并将图片按照指定的规则重命名,以保证上传图片不会因为名称相同而被覆盖。另外,代码中使用Q来避免直接使用回调函数,以更好地对函数功能进行分离。 上面的代码在PC端浏览器以及大部分主流移动设备上都能正常工作,但是少部分Android设备上却会出现上传的图片字节数为0的情况。具体的原因大家可以看下面几个网页中的描述: 就是说这个是Android的一个bug! 那如何解决呢? 其实从上面给出的页面中可以找到答案,就是我们得换一种文件上传方式。在XHR2中,除了以Blob的方式上传文件外,还可以ArrayBuffer的方式上传文件。 下面是修改之后的前端JavaScript代码: var filechooser = document.getElementById("choose"); filechooser.onchange = function () { var _this = $(this); if (!this.files.length) return; var files = Array.prototype.slice.call(this.files); if (files.length > 1) { alert("一次只能上传1张图片"); return; } files.forEach(function (file, i) { if (!/\/(?:jpegpnggif)/i.test(file.type)) return; var reader = new FileReader(); reader.onload = function () { var result = this.result; upload(result, file.type); }; reader.readAsDataURL(file); }); }; function upload(basestr, type){ var xhr = new XMLHttpRequest(); var text = window.atob(basestr.split(",")[1]); var buffer = new Uint8Array(text.length); var pecent = 0; for (var i = 0; i < text.length; i++) { buffer[i] = text.charCodeAt(i); } xhr.open('post', '/uploadtest?filetype=' + type.split('/')[1]); xhr.setRequestHeader('Content-Type', 'application/octet-stream'); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { var jsonData = JSON.parse(xhr.responseText); console.log(jsonData); } }; //利用progress事件显示数据发送进度 xhr.upload.addEventListener('progress', function (e) { pecent = ~~(100 * e.loaded / e.total) / 2; // 利用pecent来显示上传进度 }, false); xhr.send(buffer.buffer); // 以ArrayBuffer的方式上传图片 } 我将有变化的地方加了高亮显示。以ArrayBuffer方式上传图片必须添加'application/octet-stream'的RequestHeader,否则服务器无法响应请求。另外,通过这种方式上传图片我们也无法从表单数据中获取到文件类型,可以将文件类型以query的方式传到服务器,然后服务器根据文件类型来生成对应的文件,以下是经过少量修改之后的服务器代码: imageUpload.prototype.uploadImageTest = function(req){ var pathName = 'uploadImgs/dealInfo/'; var uploadPath = path.join(__dirname, '../../public/', pathName); return this.useFormParseCallback(req).then(function(files){ var file = files[1].file; var fileType = req.query.filetype ? ('.' + req.query.filetype) : '.png'; var newFileName = 'upload_' + moment().format('x') + Math.random().toString().substr(2, 10) + '.' + fileType; var readStream = fs.createReadStream(file.path); var writeStream = fs.createWriteStream(uploadPath + newFileName); var deferred = Q.defer(); readStream.pipe(writeStream); readStream.on('end', deferred.makeNodeResolver()); return deferred.promise.then(function() { fs.unlinkSync(file.path); return { fileName: newFileName, filePath: '/' + pathName + newFileName, fileSize: file.size/1024 > 1024 ? (~~(10*file.size/1024/1024))/10 + "MB" : ~~(file.size/1024) + "KB" }; }); }); }; 修改之后的代码可以支持Android手机,包括微信浏览器。注意不是所有的Android手机都会存在该问题,如果你发现在Andriod手机上无法上传图片,尤其是在微信浏览器中,则可以尝试下上面的方法。 以上所述是小编给大家介绍的关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法,希望对大家有所帮助!