博客 (3)

iPhone 或安卓上传的照片,可能因横向或纵向拍摄,导致上传后照片显示成 90 度、180 度、270 度角旋转,使用 C# 处理该照片时同样会遇到相同的问题。

解决的方案:

客户端使用 base64 显示图片,可按正常方向显示,且不通过服务端即时显示。关键代码:

$('#file_input').change(function (e) {
    if (e.target.files.length == 0) { return; }
    // file 转换为 base64
    var reader = new FileReader();
    reader.readAsDataURL(e.target.files[0]);
    reader.onload = function (event) {
        $('#myImg').attr('src', event.target.result).css({ width: 'auto', height: 'auto' });
    }
});
$('#myImg').on('load', function () {
    console.log('图片加载完成')
});

但 base64 字符串传递到服务端受请求大小限制(一般比直接 POST 文件要小)。所以显示图片的同时应即时使用 POST 方式上传图片(如 jquery.fileupload.js)。

当然如果是在微信中打开网页,使用 JS-SDK 的 wx.chooseImage() 返回的 localId 也可以在 <img /> 中正常显示,然后使用 wx.uploadImage() 上传到微信服务器并获取 serverId,在通过获取临时素材接口取回图片文件。

服务端如果需要处理该图片(缩放、裁切、旋转等),需要先读取照片的拍摄角度,旋正后,再进行处理,相关 C# 代码:

/// <summary>
/// 调整照片的原始拍摄旋转角度
/// </summary>
/// <param name="img"></param>
/// <returns></returns>
private Image ImageRotateFlip(Image img)
{
    foreach (var prop in img.PropertyItems)
    {
        if (prop.Id == 0x112)
        {
            switch (prop.Value[0])
            {
                case 6: img.RotateFlip(RotateFlipType.Rotate90FlipNone); break;
                case 3: img.RotateFlip(RotateFlipType.Rotate180FlipNone); break;
                case 8: img.RotateFlip(RotateFlipType.Rotate270FlipNone); break;
            }
            prop.Value[0] = 1;
        }
    }
    return img;
}
xoyozo 3 年前
2,304

类参考:http://lbs.tianditu.gov.cn/api/js4.0/opensource/class/ImageOverlay.html

资源引用:http://lbs.tianditu.gov.cn/api/js4.0/opensource/openlibrary/ImageOverlay.js

压缩文件:http://lbs.tianditu.gov.cn/api/js4.0/opensource/openlibrary/ImageOverlay.min.js

示例:http://lbs.tianditu.gov.cn/api/js4.0/opensource/demo/ImageOverlay.html


添加图片覆盖物:

map = new T.Map('mapDiv');
map.centerAndZoom(new T.LngLat(116.390750, 39.916980), zoom);
var bd = new T.LngLatBounds(
    new T.LngLat(116.385360, 39.911380),
    new T.LngLat(116.395940, 39.921400));
img = new T.ImageOverlay("http://lbs.tianditu.gov.cn/images/openlibrary/gugong.jpg", bd, {
    opacity: 1,
    alt: "故宫博物院"
});
map.addOverLay(img);

修改图片地址:

img.setImageUrl(imgBase64);


xoyozo 3 年前
3,791

在学习和使用 ASP.NET Web API 之前,最好先对 RESTful 有所了解。它是一种软件架构风格、设计风格,而不是标准。


推荐视频教程:https://www.imooc.com/learn/811

讲师:会飞的鱼Xia

需时:2小时25分


REST API 测试工具:

在 Chrome 网上应用店中搜索:Restlet Client

或网站 https://client.restlet.com


>>> 资源路径

SCHEME :// HOST [ ":" PORT ] [ PATH [ "?" QUERY ]]

其中 PATH 中的资源名称应该使用复数名词,举例:

GET https://xoyozo.net/api/Articles/{id}

POST https://xoyozo.net/api/Articles


>>> HTTP verb(对应 CURD 操作):

方法功能ASP.NET Web API 接口返回类型(一般的)
GET取一个或多个资源T 或 IEnumerable<T>
POST增加一个资源T
PUT修改一个资源T
DELETE删除一个资源void
PATCH更新一个资源(资源的部分属性)
HEAD获取报头
OPTIONS查询服务器性能或资源相关选项和需求


>>> 过滤信息:

如分页、搜索等


>>> 常用状态码:

200
OK
指示请求已成功
201
Created
资源创建成功(常见用例是一个 PUT 请求的结果)
202
Accepted
该请求已被接收但尚未起作用。它是非承诺的,这意味着HTTP中没有办法稍后发送指示处理请求结果的异步响应。
204
No Content
成功 PUT(修改)或 DELETE(删除)一个资源后返回空内容(ASP.NET Web API 中将接口返回类型设置为 void 即可)
400
Bad Request
服务器无法理解请求(如必填项未填、内容超长、分页大小超限等),幂等
401
Unauthorized
未授权(如用户未登录时执行了须要登录才能执行的操作),通俗地讲,是服务器告诉你,“你没有通过身份验证 - 根本没有进行身份验证或验证不正确 - 但请重新进行身份验证并再试一次。”这是暂时的,服务器要求你在获得授权后再试一次。
403
Forbidden
服务器理解请求但拒绝授权(是永久禁止的并且与应用程序逻辑相关联(如不正确的密码、尝试删除其它用户发表的文章)、IP 被禁止等),通俗地讲,是服务器告诉你,“我很抱歉。我知道你是谁 - 我相信你说你是谁 - 但你只是没有权限访问此资源。”
404
Not Found
找不到请求的资源(指资源不存在,如果找到但无权访问则应返回 403)
405
Method Not Allowed
请求方法被禁用(HTTP 动词)
500
Internal Server Error
服务器遇到阻止它履行请求的意外情况(如数据库连接失败)
503
Service Unavailable
服务器尚未准备好处理请求(常见原因是服务器因维护或重载而停机,这是临时的,可用于在单线程处理事务时遇到被锁定时的响应,如抽奖活动、抢楼活动,防止因并发导致逻辑错误)


>> 错误处理:

C# 例:throw new HttpResponseException(HttpStatusCode.NotFound);

PHP 例:throw new Exception('文章不存在', 404);


>>> 返回结果:

JSON/XML

不要返回密码等机密字段


>>> 其它:

身份验证窗口(浏览器弹窗,类似 alert,非页面表单),明文传输,安全性不高,不建议使用。实现:

在 Headers 中添加 Authorization:Basic “用户名:密码”的 Base64 编码


xoyozo 6 年前
3,353