【调错】(一)上传图片时缩略图显示问题
来源:互联网 发布:hive sql union 编辑:程序博客网 时间:2024/06/05 18:57
问题描述:
当用户上传的图片太大时,如6M。此时生成的缩略图显示有问题(部分图片为黑色,没有压缩完全)
问题分析:
1.(压缩的)原图有问题。
2. 压缩过程的代码有问题。
最初版本 设计流程 图片上传并压缩的思路:
app中上传图片到服务器本地,服务器上传图片到AWS3.后删除服务器本地的图片。
异步,从AWS3中获取图片,并下载到服务器本地。
把拿到的图片进行缩略图,后上传到AWS3.后删除服务器本地的图片
优点:异步处理缩略图。
缺点:上传过程,图片已经到达服务器本地了。但,又删除。为了达到压缩图的目的,从AWS3重新下载,后上传。资源浪费。
测试过程:
注释掉以下代码:图片压缩后,删除服务器本地的图片。
通过本地的http请求,上传6.8M的图片。
看服务器/tmp目录中 是否存在该图片?发现 原图6.8M,而/tmp目录中该图片才1.9M
猜测:网络不好的原因。
分析代码,curl中设置的timeout=15s 时间太短,延长为100s。
问题依旧。
总之,已经定位到了问题的关键!下载的原图有问题,导致压缩图不正常。
中间版本:优化思路
图片从AWS3中下载到服务器本地的过程,不使用curl命令/wget命令。————> 使用AWS3自身api实现文件下载
最终版本 待开发
不采用 以下方式:从AWS3中下载图片后,本地压缩,后压缩后的图片上传到AWS3
采用 以下方式:图片上传到AWS33后,直接在AWS的服务器上 实现图片压缩的功能。
==================最初版本 核心代码====================
String url = "http://p.upcdn.asiainfo.com/shitang/p/u/2017/11/10/222bc919-d0f1-445d-addf-23e68652b715.jpg";
String file = "/tmp/222bc919-d0f1-445d-addf-23e68652b715.jpg_8971304923840766083905.tmp";
curl --connect-timeout 100 -o + "file" + -s -w %{http_code} + "url"
wget -c -t 3 --timeout=60 -O "file" "url"
private String downPic(String url, String file) {//取得当前JVM的运行时环境Runtime rt = Runtime.getRuntime();//Java代码中通过curl命令下载图片,并设置timeout时间:100sProcess p = rt.exec("curl --connect-timeout 100 -o " + file + " -s -w %{http_code} " + url);int exitVal = p.waitFor();System.out.println(exitVal == 0 ? "成功" : "失败");StringBuilder sb = new StringBuilder();InputStream inputStream = p.getInputStream();int read;while ((read = inputStream.read()) != -1) { sb.append((char) read);}p.destroy();rt.gc();String httpCode = sb.toString();}
拓展说明:
java.lang.Runtime.exec方法 作用:用于调用外部程序,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。
exec(String command) ,调用外部程序,入参command为外部可执行程序的启动路径或命令。
参考:《Java魔法堂:找外援的利器——Runtime.exec详解 https://www.cnblogs.com/fsjohnhuang/p/4081445.html》
参考:《Java Runtime.exec()的使用 https://www.cnblogs.com/mingforyou/p/3551199.html》
==================中间版本 核心代码====================
/*通过AWS的api下载图片*///bucketId = up-picture//key = http://p.upcdn.asiainfo.com/shitang/p/u/2017/11/9/be610462-ca16-4512-9980-d0bc2932c98a.jpgpublic S3Object getFile(String bucketId, String key) throws IOException {key = key.shitangtsWith("/") ? key.substring(1) : key;S3Object s3object = s3.getObject(new GetObjectRequest(bucketId, key));return s3object;}//url = http://p.upcdn.asiainfo.com/shitang/p/u/2017/11/10/222bc919-d0f1-445d-addf-23e68652b715.jpg//file = /tmp/222bc919-d0f1-445d-addf-23e68652b715.jpg_8971304923840766083905.tmpprivate String downPic(String url, String file) {String httpCode = "";try { String bucketId = storageService.getBucketId(UploadConstants.UPLOAD_FILE_PICTURE); //示例:String key = "shitang/p/u/2017/11/9/222bc919-d0f1-445d-addf-23e68652b715.jpg"; String key = url.substring(url.indexOf("shitang"), url.length()); S3Object response = awsS3StorageService.getFile(bucketId, key); // 输入流 InputStream is = response.getObjectContent(); // 1K的数据缓冲 byte[] bs = new byte[1024]; // 读取到的数据长度 int len; // 输出的文件流 OutputStream os = new FileOutputStream(new File(file)); // 开始读取 while ((len = is.read(bs)) != -1) { os.write(bs, 0, len); } // 完毕,关闭所有链接 os.close(); is.close(); httpCode = "200";} catch (Exception e) { log.info("exception", e);}return httpCode;}
参考《http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/dev/RetrievingObjectUsingJava.html》
===============最终版本:优化思路====================
待开发中....
阅读全文
0 0
- 【调错】(一)上传图片时缩略图显示问题
- 图片上传 显示缩略图
- 图片上传 显示缩略图
- 图片上传显示缩略图
- 上传图片,即时显示缩略图
- 关于图片上传和显示缩略图的问题
- CKfinder上传图片缩略图问题
- JS实现input上传图片时显示缩略图
- HTML5上传图片base64编码显示缩略图
- JQuery实现input上传图片显示缩略图
- Larvel5.2上传图片并显示缩略图
- ThinkPHP 上传图片,并显示缩略图
- Larvel5.2上传图片并显示缩略图
- JQuery实现input上传图片显示缩略图
- 上传图片显示缩略图,可上传多张
- listview显示图片缩略图的问题
- asp.net 自定义控件实现无刷新上传图片,立即显示缩略图,保存图片缩略图
- 上传图片并显示缩略图的最简单方法(c#)
- ff更改高级设置
- sys模块
- Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结
- Spring MVC的web.xml配置详解
- Nginx 服务器 之Nginx与tomcat实现负载均衡
- 【调错】(一)上传图片时缩略图显示问题
- 小学奥数思维训练(一)
- Android开发之漫漫长途 Ⅰ——Android系统的创世之初以及Activity的生命周期
- 3年工作经验java程序员应有的技能
- linux下intel使用intel mpi(2)
- Unity3d 官方自带人物控制器研究
- 第十一周项目实践1 图基本算法库
- Slack监视中的sql查询
- this关键字作用详解