电脑往手机微信照片上传电脑传照片不显示文件名

教你用微信将手机照片和文件传到电脑,无需数据线!
我的图书馆
教你用微信将手机照片和文件传到电脑,无需数据线!
  前言  我们经常在手机微信上看到非常不错的文章、文字或者图片,喜欢拿来分享、交流,这个时候,如何把微信内容保存到电脑上进行操作是大家需要了解的,小编总结了以下三种方法,相信你可以从中找到适合自己的便捷操作。  方法一:使用微信文件传输助手  1、 登陆微信网页版。(网址:https://wx.qq.com/)  用户使用手机扫描网页上的二维码,即可登录微信网页版。  2、 在微信上找出“文件传输助手”,点击文件传输助手功能,输入文字、图片、语音内容,你能快速在手机与电脑上传输文件(互通)。  【温馨提示】  微信网页版的聊天信息会同步至手机,建议将手机接入WiFi环境以节省流量。  此方法的优点是任何东西都可以传输。  方法二:使用Evernote  1、 在微信手机版,添加“我的印象笔记”(微信号为“myyxbj”),点击授权链接,输入印象笔记账号,授权。  2、 授权成功后,当你需要传输文字、图片、语音、位置信息、视频等内容时,点击印象笔记,手机每次输入内容即可看到印象笔记回复“保存成功”;另一种方式,在别处长按需要保存的内容,出现“复制”“转发”“删除”“公众号”选项框后,点击“公众号”选项,调出“印象笔记”图标,进行保存。  缺点:无法保存纯文字。在朋友圈分享的纯文字和与朋友直发的纯文字,无法保存。  方法三:邮箱助手  1、 在您的微信通信录中,找出“qq邮箱提醒 ”插件,如果没有请在“设置”-“功能”-“QQ邮箱提醒”,选择启用。  2、 直接输入你的文字、图片等信息;若想分享别处链接,长按网页文章会显示出编辑选项,选择“复制链接”。  3、回到邮箱编辑界面,选择“粘贴”,将网页文章链接复制过来。填写好地址主题等信息。  4、 点击选项“传送”,完成操作。  优点:直接发送到自己的qq邮箱,便于转发等。  (本文内容来源于网络 版权归原作者所有)
喜欢该文的人也喜欢通过“微信文件传输助手”从手机向电脑传照片的步骤
通过“微信文件传输助手”从手机向电脑传照片的步骤
在手机上拍的照片可以通过“微信文件传输助手”上传到电脑中,步骤如下:
在电脑上打开浏览器Internet Explorer;
在网址输入框中输入微信网页版的网址:
浏览器会显示出一个二维码的图片,如下图:
在手机上打开“微信”,点一下标题栏中间的“发现”菜单,然后再点一下“扫一扫”
手机上会出现一个照相扫描框,将手机移动到电脑屏幕前,使手机上的扫描框正好框住电脑屏幕上的二维码,扫描成功后会听到手机发出“嘀”的一声,同时手机的屏幕变成下面的样子:
此时点击一下绿色的按钮“我确认登录微信网页版”,就可以在电脑上同时连接微信网页版了(浏览器里面会显示微信的界面)。
在手机上的微信中点击“文件传输助手”
进入“文件传输助手”后点击屏幕右下角的“+”号;
点击一下“图片”,然后选择“从相册选择”;
点击一下想传输的相册,在照片列表中勾选上想要传输到电脑的照片,然后点击右上角的绿色“发送”按钮,就可以将选中的照片发送到“文件传输助手”中;
在电脑上的微信中点击一下“文件传输助手”,就可以看到从手机上传的图片了。点击图片可以看到大图,在图片上点击鼠标右键,然后选择“图片另存为...”菜单项,可以把照片保存到电脑上。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
微信内网页某些安卓手机不能上传图片文件的问题(2)
摘要:起这个标题名只是为了和前一篇文章相对应。相对比较完善的手机端网页图片上传完成了,其中碰见了很多问题,由于是第一次弄,就一个个的解决掉,最后这个目前来说是比较满意的版本。开发环境为Bootstrap框架,另外需要引进一个JS用于判断图片拍摄的角度问题。为什么要用这个呢?因为IOS系统在拍摄照片时,会给生成的图片文件添加一个拍摄角度的数据,在文件上传时,是用HTML5的canvas加载图片,然后输出base64字符串,在服务器上保存时图片会发生翻转,这个问题只在苹果手机上有,安卓
起这个标题名只是为了和前一篇文章相对应。
相对比较完善的手机端网页图片上传完成了,其中碰见了很多问题,由于是第一次弄,就一个个的解决掉,最后这个目前来说是比较满意的版本。
开发环境为 Bootstrap框架,另外需要引进一个JS用于判断图片拍摄的角度问题。
为什么要用这个呢?因为IOS系统在拍摄照片时,会给生成的图片文件添加一个拍摄角度的数据,在文件上传时,是用HTML5的 canvas加载图片,然后输出base64字符串,在服务器上保存时图片会发生翻转,这个问题只在苹果手机上有,安卓手机没这个问题。我也是第一次知道这个东西。
先上这个js的代码:Exif.js
(function() {var debug =var root =var EXIF = function(obj) { if (obj instanceof EXIF) if (!(this instanceof EXIF)) return new EXIF(obj); this.EXIFwrapped =};if (typeof exports !== 'undefined') { if (typeof module !== 'undefined' &;&; module.exports) { exports = module.exports = EXIF; } exports.EXIF = EXIF;} else { root.EXIF = EXIF;}var ExifTags = EXIF.Tags = { // version tags 0x9000 : &ExifVersion&,// EXIF version 0xA000 : &FlashpixVersion&,// Flashpix format version // colorspace tags 0xA001 : &ColorSpace&,// Color space information tag // image configuration 0xA002 : &PixelXDimension&,// Valid width of meaningful image 0xA003 : &PixelYDimension&,// Valid height of meaningful image 0x9101 : &ComponentsConfiguration&, // Information about channels 0x9102 : &CompressedBitsPerPixel&,// Compressed bits per pixel // user information 0x927C : &MakerNote&, // Any desired information written by the manufacturer 0x9286 : &UserComment&,// Comments by user // related file 0xA004 : &RelatedSoundFile&, // Name of related sound file // date and time 0x9003 : &DateTimeOriginal&, // Date and time when the original image was generated 0x9004 : &DateTimeDigitized&,// Date and time when the image was stored digitally 0x9290 : &SubsecTime&,// Fractions of seconds for DateTime 0x9291 : &SubsecTimeOriginal&,// Fractions of seconds for DateTimeOriginal 0x9292 : &SubsecTimeDigitized&, // Fractions of seconds for DateTimeDigitized // picture-taking conditions 0x829A : &ExposureTime&, // Exposure time (in seconds) 0x829D : &FNumber&, // F number 0x8822 : &ExposureProgram&,// Exposure program 0x8824 : &SpectralSensitivity&, // Spectral sensitivity 0x8827 : &ISOSpeedRatings&,// ISO speed rating 0x8828 : &OECF&,// Optoelectric conversion factor 0x9201 : &ShutterSpeedValue&,// Shutter speed 0x9202 : &ApertureValue&,// Lens aperture 0x9203 : &BrightnessValue&,// Value of brightness 0x9204 : &ExposureBias&, // Exposure bias 0x9205 : &MaxApertureValue&, // Smallest F number of lens 0x9206 : &SubjectDistance&,// Distance to subject in meters 0x9207 : &MeteringMode&, // Metering mode 0x9208 : &LightSource&,// Kind of light source 0x9209 : &Flash&, // Flash status 0x9214 : &SubjectArea&,// Location and area of main subject 0x920A : &FocalLength&,// Focal length of the lens in mm 0xA20B : &FlashEnergy&,// Strobe energy in BCPS 0xA20C : &SpatialFrequencyResponse&,// 0xA20E : &FocalPlaneXResolution&, // Number of pixels in width direction per FocalPlaneResolutionUnit 0xA20F : &FocalPlaneYResolution&, // Number of pixels in height direction per FocalPlaneResolutionUnit 0xA210 : &FocalPlaneResolutionUnit&,// Unit for measuring FocalPlaneXResolution and FocalPlaneYResolution 0xA214 : &SubjectLocation&,// Location of subject in image 0xA215 : &ExposureIndex&,// Exposure index selected on camera 0xA217 : &SensingMethod&,// Image sensor type 0xA300 : &FileSource&,// Image source (3 == DSC) 0xA301 : &SceneType&, // Scene type (1 == directly photographed) 0xA302 : &CFAPattern&,// Color filter array geometric pattern 0xA401 : &CustomRendered&, // Special processing 0xA402 : &ExposureMode&, // Exposure mode 0xA403 : &WhiteBalance&, // 1 = auto white balance, 2 = manual 0xA404 : &DigitalZoomRation&,// Digital zoom ratio 0xA405 : &FocalLengthIn35mmFilm&, // Equivalent foacl length assuming 35mm film camera (in mm) 0xA406 : &SceneCaptureType&, // Type of scene 0xA407 : &GainControl&,// Degree of overall image gain adjustment 0xA408 : &Contrast&,// Direction of contrast processing applied by camera 0xA409 : &Saturation&,// Direction of saturation processing applied by camera 0xA40A : &Sharpness&, // Direction of sharpness processing applied by camera 0xA40B : &DeviceSettingDescription&,// 0xA40C : &SubjectDistanceRange&,// Distance to subject // other tags 0xA005 : &InteroperabilityIFDPointer&, 0xA420 : &ImageUniqueID& // Identifier assigned uniquely to each image};var TiffTags = EXIF.TiffTags = { 0x0100 : &ImageWidth&, 0x0101 : &ImageHeight&, 0x8769 : &ExifIFDPointer&, 0x8825 : &GPSInfoIFDPointer&, 0xA005 : &InteroperabilityIFDPointer&, 0x0102 : &BitsPerSample&, 0x0103 : &Compression&, 0x0106 : &PhotometricInterpretation&, 0x0112 : &Orientation&, 0x0115 : &SamplesPerPixel&, 0x011C : &PlanarConfiguration&, 0x0212 : &YCbCrSubSampling&, 0x0213 : &YCbCrPositioning&, 0x011A : &XResolution&, 0x011B : &YResolution&, 0x0128 : &ResolutionUnit&, 0x0111 : &StripOffsets&, 0x0116 : &RowsPerStrip&, 0x0117 : &StripByteCounts&, 0x0201 : &JPEGInterchangeFormat&, 0x0202 : &JPEGInterchangeFormatLength&, 0x012D : &TransferFunction&, 0x013E : &WhitePoint&, 0x013F : &PrimaryChromaticities&, 0x0211 : &YCbCrCoefficients&, 0x0214 : &ReferenceBlackWhite&, 0x0132 : &DateTime&, 0x010E : &ImageDescription&, 0x010F : &Make&, 0x0110 : &Model&, 0x0131 : &Software&, 0x013B : &Artist&, 0x8298 : &Copyright&};var GPSTags = EXIF.GPSTags = { 0x0000 : &GPSVersionID&, 0x0001 : &GPSLatitudeRef&, 0x0002 : &GPSLatitude&, 0x0003 : &GPSLongitudeRef&, 0x0004 : &GPSLongitude&, 0x0005 : &GPSAltitudeRef&, 0x0006 : &GPSAltitude&, 0x0007 : &GPSTimeStamp&, 0x0008 : &GPSSatellites&, 0x0009 : &GPSStatus&, 0x000A : &GPSMeasureMode&, 0x000B : &GPSDOP&, 0x000C : &GPSSpeedRef&, 0x000D : &GPSSpeed&, 0x000E : &GPSTrackRef&, 0x000F : &GPSTrack&, 0x0010 : &GPSImgDirectionRef&, 0x0011 : &GPSImgDirection&, 0x0012 : &GPSMapDatum&, 0x0013 : &GPSDestLatitudeRef&, 0x0014 : &GPSDestLatitude&, 0x0015 : &GPSDestLongitudeRef&, 0x0016 : &GPSDestLongitude&, 0x0017 : &GPSDestBearingRef&, 0x0018 : &GPSDestBearing&, 0x0019 : &GPSDestDistanceRef&, 0x001A : &GPSDestDistance&, 0x001B : &GPSProcessingMethod&, 0x001C : &GPSAreaInformation&, 0x001D : &GPSDateStamp&, 0x001E : &GPSDifferential&};var StringValues = EXIF.StringValues = { ExposureProgram : { 0 : &Not defined&, 1 : &Manual&, 2 : &Normal program&, 3 : &Aperture priority&, 4 : &Shutter priority&, 5 : &Creative program&, 6 : &Action program&, 7 : &Portrait mode&, 8 : &Landscape mode& }, MeteringMode : { 0 : &Unknown&, 1 : &Average&, 2 : &CenterWeightedAverage&, 3 : &Spot&, 4 : &MultiSpot&, 5 : &Pattern&, 6 : &Partial&, 255 : &Other& }, LightSource : { 0 : &Unknown&, 1 : &Daylight&, 2 : &Fluorescent&, 3 : &Tungsten (incandescent light)&, 4 : &Flash&, 9 : &Fine weather&, 10 : &Cloudy weather&, 11 : &Shade&, 12 : &Daylight fluorescent (D 5700 - 7100K)&, 13 : &Day white fluorescent (N 4600 - 5400K)&, 14 : &Cool white fluorescent (W 3900 - 4500K)&, 15 : &White fluorescent (WW 3200 - 3700K)&, 17 : &Standard light A&, 18 : &Standard light B&, 19 : &Standard light C&, 20 : &D55&, 21 : &D65&, 22 : &D75&, 23 : &D50&, 24 : &ISO studio tungsten&, 255 : &Other& }, Flash : { 0x0000 : &Flash did not fire&, 0x0001 : &Flash fired&, 0x0005 : &Strobe return light not detected&, 0x0007 : &Strobe return light detected&, 0x0009 : &Flash fired, compulsory flash mode&, 0x000D : &Flash fired, compulsory flash mode, return light not detected&, 0x000F : &Flash fired, compulsory flash mode, return light detected&, 0x0010 : &Flash did not fire, compulsory flash mode&, 0x0018 : &Flash did not fire, auto mode&, 0x0019 : &Flash fired, auto mode&, 0x001D : &Flash fired, auto mode, return light not detected&, 0x001F : &Flash fired, auto mode, return light detected&, 0x0020 : &No flash function&, 0x0041 : &Flash fired, red-eye reduction mode&, 0x0045 : &Flash fired, red-eye reduction mode, return light not detected&, 0x0047 : &Flash fired, red-eye reduction mode, return light detected&, 0x0049 : &Flash fired, compulsory flash mode, red-eye reduction mode&, 0x004D : &Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected&, 0x004F : &Flash fired, compulsory flash mode, red-eye reduction mode, return light detected&, 0x0059 : &Flash fired, auto mode, red-eye reduction mode&, 0x005D : &Flash fired, auto mode, return light not detected, red-eye reduction mode&, 0x005F : &Flash fired, auto mode, return light detected, red-eye reduction mode& }, SensingMethod : { 1 : &Not defined&, 2 : &One-chip color area sensor&, 3 : &Two-chip color area sensor&, 4 : &Three-chip color area sensor&, 5 : &Color sequential area sensor&, 7 : &Trilinear sensor&, 8 : &Color sequential linear sensor& }, SceneCaptureType : { 0 : &Standard&, 1 : &Landscape&, 2 : &Portrait&, 3 : &Night scene& }, SceneType : { 1 : &Directly photographed& }, CustomRendered : { 0 : &Normal process&, 1 : &Custom process& }, WhiteBalance : { 0 : &Auto white balance&, 1 : &Manual white balance& }, GainControl : { 0 : &None&, 1 : &Low gain up&, 2 : &High gain up&, 3 : &Low gain down&, 4 : &High gain down& }, Contrast : { 0 : &Normal&, 1 : &Soft&, 2 : &Hard& }, Saturation : { 0 : &Normal&, 1 : &Low saturation&, 2 : &High saturation& }, Sharpness : { 0 : &Normal&, 1 : &Soft&, 2 : &Hard& }, SubjectDistanceRange : { 0 : &Unknown&, 1 : &Macro&, 2 : &Close view&, 3 : &Distant view& }, FileSource : { 3 : &DSC& }, Components : { 0 : &&, 1 : &Y&, 2 : &Cb&, 3 : &Cr&, 4 : &R&, 5 : &G&, 6 : &B& }};function addEvent(element, event, handler) { if (element.addEventListener) { element.addEventListener(event, handler, false); } else if (element.attachEvent) { element.attachEvent(&on& + event, handler); }}function imageHasData(img) { return !!(img.exifdata);}function base64ToArrayBuffer(base64, contentType) { contentType = contentType || base64.match(/^data/:([^/;]+)/;base64,/mi)[1] || ''; // e.g. 'data:image/base64,...' =& 'image/jpeg' base64 = base64.replace(/^data/:([^/;]+)/;base64,/gmi, ''); var binary = atob(base64); var len = binary. var buffer = new ArrayBuffer(len); var view = new Uint8Array(buffer); for (var i = 0; i & i++) { view[i] = binary.charCodeAt(i); }}function objectURLToBlob(url, callback) { var http = new XMLHttpRequest(); http.open(&GET&, url, true); http.responseType = &blob&; http.onload = function(e) { if (this.status == 200 || this.status === 0) {callback(this.response); } }; http.send();}function getImageData(img, callback) { function handleBinaryFile(binFile) { var data = findEXIFinJPEG(binFile); var iptcdata = findIPTCinJPEG(binFile); img.exifdata = data || {}; img.iptcdata = iptcdata || {}; if (callback) {callback.call(img); } } if (img.src) { if (/^data/:/i.test(img.src)) { // Data URIvar arrayBuffer = base64ToArrayBuffer(img.src);handleBinaryFile(arrayBuffer); } else if (/^blob/:/i.test(img.src)) { // Object URLvar fileReader = new FileReader();fileReader.onload = function(e) {handleBinaryFile(e.target.result);};objectURLToBlob(img.src, function (blob) {fileReader.readAsArrayBuffer(blob);}); } else {var http = new XMLHttpRequest();http.onload = function() {if (this.status == 200 || this.status === 0) { handleBinaryFile(http.response);} else { throw &Could not load image&;}http =};http.open(&GET&, img.src, true);http.responseType = &arraybuffer&;http.send(null); } } else if (window.FileReader &;&; (img instanceof window.Blob || img instanceof window.File)) { var fileReader = new FileReader(); fileReader.onload = function(e) {if (debug) console.log(&Got file of length & + e.target.result.byteLength);handleBinaryFile(e.target.result); }; fileReader.readAsArrayBuffer(img); }}function findEXIFinJPEG(file) { var dataView = new DataView(file); if (debug) console.log(&Got file of length & + file.byteLength); if ((dataView.getUint8(0) != 0xFF) || (dataView.getUint8(1) != 0xD8)) { if (debug) console.log(&Not a valid JPEG&); // not a valid jpeg } var offset = 2, length = file.byteLength, while (offset & length) { if (dataView.getUint8(offset) != 0xFF) {if (debug) console.log(&Not a valid marker at offset & + offset + &, found: & + dataView.getUint8(offset)); // not a valid marker, something is wrong } marker = dataView.getUint8(offset + 1); if (debug) console.log(marker); // we could implement handling for other markers here, // but we're only looking for 0xFFE1 for EXIF data if (marker == 225) {if (debug) console.log(&Found 0xFFE1 marker&);return readEXIFData(dataView, offset + 4, dataView.getUint16(offset + 2) - 2);// offset += 2 + file.getShortAt(offset+2, true); } else {offset += 2 + dataView.getUint16(offset+2); } }}function findIPTCinJPEG(file) { var dataView = new DataView(file); if (debug) console.log(&Got file of length & + file.byteLength); if ((dataView.getUint8(0) != 0xFF) || (dataView.getUint8(1) != 0xD8)) { if (debug) console.log(&Not a valid JPEG&); // not a valid jpeg } var offset = 2, length = file.byteL var isFieldSegmentStart = function(dataView, offset){ return (dataView.getUint8(offset) === 0x38 &;&;dataView.getUint8(offset+1) === 0x42 &;&;dataView.getUint8(offset+2) === 0x49 &;&;dataView.getUint8(offset+3) === 0x4D &;&;dataView.getUint8(offset+4) === 0x04 &;&;dataView.getUint8(offset+5) === 0x04 ); }; while (offset & length) { if ( isFieldSegmentStart(dataView, offset )){// Get the length of the name header (which is padded to an even number of bytes)var nameHeaderLength = dataView.getUint8(offset+7);if(nameHeaderLength % 2 !== 0) nameHeaderLength += 1;// Check for pre photoshop 6 formatif(nameHeaderLength === 0) {// Always 4nameHeaderLength = 4;}var startOffset = offset + 8 + nameHeaderLvar sectionLength = dataView.getUint16(offset + 6 + nameHeaderLength);return readIPTCData(file, startOffset, sectionLength); } // Not the marker, continue searching offset++; }}var IptcFieldMap = { 0x78 : 'caption', 0x6E : 'credit', 0x19 : 'keywords', 0x37 : 'dateCreated', 0x50 : 'byline', 0x55 : 'bylineTitle', 0x7A : 'captionWriter', 0x69 : 'headline', 0x74 : 'copyright', 0x0F : 'category'};function readIPTCData(file, startOffset, sectionLength){ var dataView = new DataView(file); var data = {}; var fieldValue, fieldName, dataSize, segmentType, segmentS var segmentStartPos = startO while(segmentStartPos & startOffset+sectionLength) { if(dataView.getUint8(segmentStartPos) === 0x1C &;&; dataView.getUint8(segmentStartPos+1) === 0x02){segmentType = dataView.getUint8(segmentStartPos+2);if(segmentType in IptcFieldMap) {dataSize = dataView.getInt16(segmentStartPos+3);segmentSize = dataSize + 5;fieldName = IptcFieldMap[segmentType];fieldValue = getStringFromDB(dataView, segmentStartPos+5, dataSize);// Check if we already stored a value with this nameif(data.hasOwnProperty(fieldName)) { // Value already stored with this name, create multivalue field if(data[fieldName] instanceof Array) {data[fieldName].push(fieldValue); } else {data[fieldName] = [data[fieldName], fieldValue]; }}else { data[fieldName] = fieldV}} } segmentStartPos++; }}function readTags(file, tiffStart, dirStart, strings, bigEnd) { var entries = file.getUint16(dirStart, !bigEnd), tags = {}, entryOffset, tag, for (i=0;i
entryOffset = dirStart + i*12 + 2;
tag = strings[file.getUint16(entryOffset, !bigEnd)];
if (!tag &;&; debug) console.log(&Unknown tag: & + file.getUint16(entryOffset, !bigEnd));
tags[tag] = readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd);
}function readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd) {
var type = file.getUint16(entryOffset+2, !bigEnd),
numValues = file.getUint32(entryOffset+4, !bigEnd),
valueOffset = file.getUint32(entryOffset+8, !bigEnd) + tiffStart,
vals, val, n,
numerator,
switch (type) {
case 1: // byte, 8-bit unsigned int
case 7: // undefined, 8-bit byte, value depending on field
if (numValues == 1) {
return file.getUint8(entryOffset + 8, !bigEnd);
offset = numValues & 4 ? valueOffset : (entryOffset + 8);
vals = [];
for (n=0;n
vals[n] = file.getUint8(offset + n);
case 2: // ascii, 8-bit byte
offset = numValues & 4 ? valueOffset : (entryOffset + 8);
return getStringFromDB(file, offset, numValues-1);
case 3: // short, 16 bit int
if (numValues == 1) {
return file.getUint16(entryOffset + 8, !bigEnd);
offset = numValues & 2 ? valueOffset : (entryOffset + 8);
vals = [];
for (n=0;n
vals[n] = file.getUint16(offset + 2*n, !bigEnd);
case 4: // long, 32 bit int
if (numValues == 1) {
return file.getUint32(entryOffset + 8, !bigEnd);
vals = [];
for (n=0;n
vals[n] = file.getUint32(valueOffset + 4*n, !bigEnd);
case 5:// rational = two long values, first is numerator, second is denominator
if (numValues == 1) {
numerator = file.getUint32(valueOffset, !bigEnd);
denominator = file.getUint32(valueOffset+4, !bigEnd);
val = new Number(numerator / denominator);
val.numerator =
val.denominator =
vals = [];
for (n=0;n
numerator = file.getUint32(valueOffset + 8*n, !bigEnd);
denominator = file.getUint32(valueOffset+4 + 8*n, !bigEnd);
vals[n] = new Number(numerator / denominator);
vals[n].numerator =
vals[n].denominator =
case 9: // slong, 32 bit signed int
if (numValues == 1) {
return file.getInt32(entryOffset + 8, !bigEnd);
vals = [];
for (n=0;n
vals[n] = file.getInt32(valueOffset + 4*n, !bigEnd);
case 10: // signed rational, two slongs, first is numerator, second is denominator
if (numValues == 1) {
return file.getInt32(valueOffset, !bigEnd) / file.getInt32(valueOffset+4, !bigEnd);
vals = [];
for (n=0;n
vals[n] = file.getInt32(valueOffset + 8*n, !bigEnd) / file.getInt32(valueOffset+4 + 8*n, !bigEnd);
function getStringFromDB(buffer, start, length) {
var outstr = &&;
for (n = n & start+ n++) {
outstr += String.fromCharCode(buffer.getUint8(n));
function readEXIFData(file, start) {
if (getStringFromDB(file, start, 4) != &Exif&) {
if (debug) console.log(&Not valid EXIF data! & + getStringFromDB(file, start, 4));
var bigEnd,
tags, tag,
exifData, gpsData,
tiffOffset = start + 6;
// test for TIFF validity and endianness
if (file.getUint16(tiffOffset) == 0x4949) {
} else if (file.getUint16(tiffOffset) == 0x4D4D) {
if (debug) console.log(&Not valid TIFF data! (no 0x4949 or 0x4D4D)&);
if (file.getUint16(tiffOffset+2, !bigEnd) != 0x002A) {
if (debug) console.log(&Not valid TIFF data! (no 0x002A)&);
var firstIFDOffset = file.getUint32(tiffOffset+4, !bigEnd);
if (firstIFDOffset & 0x) {
if (debug) console.log(&Not valid TIFF data! (First offset less than 8)&, file.getUint32(tiffOffset+4, !bigEnd));
tags = readTags(file, tiffOffset, tiffOffset + firstIFDOffset, TiffTags, bigEnd);
if (tags.ExifIFDPointer) {
exifData = readTags(file, tiffOffset, tiffOffset + tags.ExifIFDPointer, ExifTags, bigEnd);
for (tag in exifData) {
switch (tag) {
case &LightSource& :
case &Flash& :
case &MeteringMode& :
case &ExposureProgram& :
case &SensingMethod& :
case &SceneCaptureType& :
case &SceneType& :
case &CustomRendered& :
case &WhiteBalance& :
case &GainControl& :
case &Contrast& :
case &Saturation& :
case &Sharpness& :
case &SubjectDistanceRange& :
case &FileSource& :
exifData[tag] = StringValues[tag][exifData[tag]];
case &ExifVersion& :
case &FlashpixVersion& :
exifData[tag] = String.fromCharCode(exifData[tag][0], exifData[tag][1], exifData[tag][2], exifData[tag][3]);
case &ComponentsConfiguration& :
exifData[tag] =
StringValues.Components[exifData[tag][0]] +
StringValues.Components[exifData[tag][1]] +
StringValues.Components[exifData[tag][2]] +
StringValues.Components[exifData[tag][3]];
tags[tag] = exifData[tag];
if (tags.GPSInfoIFDPointer) {
gpsData = readTags(file, tiffOffset, tiffOffset + tags.GPSInfoIFDPointer, GPSTags, bigEnd);
for (tag in gpsData) {
switch (tag) {
case &GPSVersionID& :
gpsData[tag] = gpsData[tag][0] +
&.& + gpsData[tag][1] +
&.& + gpsData[tag][2] +
&.& + gpsData[tag][3];
tags[tag] = gpsData[tag];
EXIF.getData = function(img, callback) {
if ((img instanceof Image || img instanceof HTMLImageElement) &;&; !img.complete)
if (!imageHasData(img)) {
getImageData(img, callback);
if (callback) {
callback.call(img);
EXIF.getTag = function(img, tag) {
if (!imageHasData(img))
return img.exifdata[tag];
EXIF.getAllTags = function(img) {
if (!imageHasData(img)) return {};
data = img.exifdata,
tags = {};
for (a in data) {
if (data.hasOwnProperty(a)) {
tags[a] = data[a];
EXIF.pretty = function(img) {
if (!imageHasData(img)) return &&;
data = img.exifdata,
strPretty = &&;
for (a in data) {
if (data.hasOwnProperty(a)) {
if (typeof data[a] == &object&) {
if (data[a] instanceof Number) {
strPretty += a + & : & + data[a] + & [& + data[a].numerator + &/& + data[a].denominator + &]/r/n&;
strPretty += a + & : [& + data[a].length + & values]/r/n&;
strPretty += a + & : & + data[a] + &/r/n&;
return strP
EXIF.readFromBinaryFile = function(file) {
return findEXIFinJPEG(file);
if (typeof define === 'function' &;&; define.amd) {
define('exif-js', [], function() {
return EXIF;
}.call(this));页面需要添加这个js的引用
这里 只是上传一张图片的示例,需要上传多张的请自行修改。
.webuploader_pick { -moz-user-select: border-radius: 3 color: # cursor: display: inline- float: font-size: 80 text-align: line-height: 90 transition: border 0.2s; -moz-transition: border 0.2s; -webkit-transition: border 0.2s; -o-transition: border 0.2s; width: 100%;}JS处理代码:
var FileArray = new Array();FileArray = [];var IsUpload = 0;$(function () { // 初始化 $(&.webuploader_pick&).bind(&click&, function (e) { $(&#SelectFile&).click(); }); //上传图片相关 var photo = $(&#SelectFile&); photo.on('change', function (event) { Compress(event, function (base64Img) {$.ajax({type: &POST&,url: &&, //你的上传处理文件data: JSON.stringify({ &FileString&: base64Img,//图片的base64字符串 &Angle&: $(&#HiddenImageStr&).val() //记录拍摄角度的东西}),contentType: &application/charset=utf-8&,dataType: &text&,cache: false,success: function (text) { //alert(text); FileArray.push(text); var serve_path = ''; //根据存入 FileArray d的文件信息做相应操作 for (var k = 0; k & FileArray. k++) {//取出数据做处理var st = FileArray[k];var str = st.split('|');var savepath = str[0];var imageName = str[1];var ImageHtml = &&;ImageHtml += &&;ImageHtml += &&;ImageHtml += &&;ImageHtml += &&;ImageHtml += &&;ImageHtml += &&;$(&#Image1&).empty();$(&#Image1&).html(ImageHtml);$(&#Image1&).show();$(&#uploadDiv&).hide();IsUpload++; } FileArray = [];},error: function (XMLHttpRequest, textStatus, errorThrown) { alert(textStatus + errorThrown);}}); }); }); function Compress(event, callback) { if (window.File &;&; window.FileList) {var fileCount = document.getElementById(&SelectFile&).files.if (fileCount & 1) {layer.confirm('每次可上传1张图片!', { btn: ['确定'], icon: 0});}else {//检查上传文件的类型var files = document.getElementById(&SelectFile&).for (var i = 0; i & files. i++) { var t = files[i].type.toLowerCase(); var s = files[i]. //判断是否为图片类型 var isImage = 0; if (t.indexOf('jpg') &= 0)isImage++; if (t.indexOf('jpeg') &= 0)isImage++; if (t.indexOf('png') &= 0)isImage++; if (t.indexOf('gif') &= 0)isImage++; if (t.indexOf('bmp') &= 0)isImage++; if (isImage == 0) {layer.confirm('请选择图片类型文件上传!', {btn: ['确定'], icon: 0}); }}if (files &;&; files[0]) { EXIF.getData(files[0], function () {EXIF.getAllTags(this);var Orient = EXIF.getTag(this, 'Orientation'); //这个就是记录拍摄角度的东西 var FR = new FileReader();FR.onload = function (e) {//获得一个图片对象var image = $(&&);image.on('load', function () { var actW var actH var maxwidth = 800;//手机上最宽的定为800像素,太大的没有必要。可自行修改 var canvas = document.createElement(&canvas&); var ctx = canvas.getContext(&2d&); var R //这个是拍摄角度正常,或者没有设置过的 if (typeof (Orient) == &undefined& || parseInt(Orient) == 1) { Rorateangel = 1; actWidth = this. actHeight = this. var scale = actWidth / actH if (actWidth & maxwidth) {canvas.width =canvas.height = parseInt(maxwidth / scale); } else {canvas.width = actWcanvas.height = actH } } else if (parseInt(Orient) &= 3) { Rorateangel = parseInt(Orient); switch (Orient) {case 6://拍摄时左转了90度{ actWidth = this. actHeight = this. var scale = actWidth / actH if (actWidth & maxwidth) {canvas.height =canvas.width = parseInt(maxwidth / scale); } else {canvas.width = actWcanvas.height = actH }}case 8: //拍摄时右转了90度{ actWidth = this. actHeight = this. var scale = actWidth / actH if (actWidth & maxwidth) {canvas.height =canvas.width = parseInt(maxwidth / scale); } else {canvas.width = actWcanvas.height = actH }}case 3: //拍摄是 翻转了180度{ actWidth = this. actHeight = this. var scale = actWidth / actH if (actWidth & maxwidth) {canvas.width =canvas.height = parseInt(maxwidth / scale); } else {canvas.width = actWcanvas.height = actH }} } } $(&#HiddenImageStr&).val(Rorateangel);//这个就是页面 用一个隐藏域放置翻转角度的值 ctx.drawImage(this, 0, 0, canvas.width, canvas.height); var base64 = canvas.toDataURL('image/jpeg', 0.5); callback(base64);});image.attr('src', e.target.result);};FR.readAsDataURL(files[0]); });}} } else {layer.confirm('抱歉,你的浏览器不支持FileAPI,请升级浏览器!', {btn: ['确定'], icon: 0}); } }});//删除上传的图片方法function ToDelImage() { var deleteValue = $(&#hiddenUploadImage&).val(); $(&#Image1&).empty(); $(&#Image1&).hide(); $(&#uploadDiv&).show(); IsUpload--; FileArray = []; //在服务器上删除文件 $.ajax({ type: &POST&, url: &&, //删除图片的处理URL data: JSON.stringify({&delString&: deleteValue }), contentType: &application/charset=utf-8&, dataType: &text&, cache: false, success: function (text) { } });}
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
微信内网页某些安卓手机不能上传图片文件的问题(2)相关信息,包括
的信息,所有微信内网页某些安卓手机不能上传图片文件的问题(2)相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International

我要回帖

更多关于 微信照片文件名 的文章

 

随机推荐