5_1_图片上传

图片上传

一 需求

1 图片上传到本地;

2 图片上传到七牛云。

  效果图:

  

二 具体代码实现

1 ToutiaoUtil.java: 用来判断上传的文件名是否合格;

package com.nowcoder.util;

import com.alibaba.fastjson.JSONObject;
import com.nowcoder.controller.LoginController;
import org.omg.CORBA.PUBLIC_MEMBER;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.security.MessageDigest;
import java.util.Map;

/**
 * Created by nowcoder on 2016/7/3.
 */
public class ToutiaoUtil {
    private static final Logger logger = LoggerFactory.getLogger(ToutiaoUtil.class);

    private static String[] IMAGE_FILE_EXT = {"png", "bmg", "jpg", "jpeg"};
    public static String IMAGE_DIR = "H:/toutiao/upload/";
    public static String IMAGE_DOMAIN = "http://192.168.0.100:8080/";

    public static boolean isAllowed(String fileExt) {

        if (fileExt == null) {
            return false;
        }

        for (String ext : IMAGE_FILE_EXT) {
            if (ext.equals(fileExt)) {
                return true;
            }
        }
        return false;
    }

}

2. NewsService.java : saveImage() 上传到本地:

/**
     * 上传到本地
     * @param file
     * @return
     * @throws IOException
     */
    public String saveImage(MultipartFile file) throws IOException{

        String fileOriName = file.getOriginalFilename();
        int dotPos = fileOriName.lastIndexOf(".");
        if(dotPos < 0){
            return  null;
        }
        String fileExt= fileOriName.substring(dotPos + 1).toLowerCase();
        if(!ToutiaoUtil.isAllowed(fileExt)){
            return null;
        }
        String fileNewName = UUID.randomUUID().toString().replaceAll("-", "") + "." + fileExt;
        Files.copy(file.getInputStream(), new File(ToutiaoUtil.IMAGE_DIR + fileNewName).toPath(),
                StandardCopyOption.REPLACE_EXISTING);
        return ToutiaoUtil.IMAGE_DOMAIN + "image?name= " + fileNewName;

    }

上传到七牛云:

package com.nowcoder.service;

import com.alibaba.fastjson.JSONObject;
import com.nowcoder.util.ToutiaoUtil;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.UUID;

/**
 * Created by Administrator on 2017/4/20.
 */
@Service
public class QiniuService {
    private static final Logger logger = LoggerFactory.getLogger(QiniuService.class);
    //设置密钥私钥
    private static final String ACCESS_KEY = "F1gWSjirYuPH6tlHmWMmTKj6Vf-o_Zv-neyhsnX7";
    private static final String SECRET_KEY = "5IGLFKGyGtp_ZM2yBLFTSMFHNxVJF4H2JG4fRckv";
    //外链默认域名
    private static final String QINIU_DOMAIN_PREFIX= "http://oopscdse9.bkt.clouddn.com/";
    //设置上传空间
    String bucketName = "nowcoder";

    //密钥配置
    Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
    String upToken = auth.uploadToken(bucketName);
    //创建上传对象
    Configuration cfg = new Configuration(Zone.zone2());
    UploadManager uploadManager = new UploadManager(cfg);

    public String saveImage(MultipartFile file) throws IOException{
        try {
            int dotPos = file.getOriginalFilename().lastIndexOf(".");
            if(dotPos < 0){
                return null;
            }
            String fileExt = file.getOriginalFilename().substring(dotPos + 1).toLowerCase();
            if(!ToutiaoUtil.isAllowed(fileExt)){
                return null;
            }
            String fileName = UUID.randomUUID().toString().replaceAll("-", "") + "." + fileExt;

            //调用put方法上传
            Response response = uploadManager.put(file.getBytes(), fileName, upToken);

            System.out.print(response.bodyString());//{"hash":"FlzkXRBfIIpQh1JhBzIEMdfJzOr1","key":"20a0ed3733f84b8585da08b6277cd60a.jpg"}
            System.out.print(response.toString());
            if(response.isOK() && response.isJson()){
                String key = JSONObject.parseObject(response.bodyString()).get("key").toString();
                return QINIU_DOMAIN_PREFIX + key;
            }else {
                logger.error("七牛异常" + response.bodyString());
                return null;
            }
        }catch (QiniuException ex){
            Response r =  ex.response;
            logger.error("读取图片错误:" + ex.getMessage());
            System.out.print(r.toString());
            return null;
        }
    }

}

3. Controller : NewsController.java

  注:fileUrl可以随意切换,如上传到本地就得到一个本地的url;

上传到七牛云就用七牛云的service得到一个url;

               上传到又拍云就用又拍云的service得到一个url.

@RequestMapping(value = {"/uploadImage"}, method = {RequestMethod.POST})
    @ResponseBody
    public String uploadImage(@RequestParam("file") MultipartFile file){
        try {
            String fileUrl = newsService.saveImage(file);
            //String fileUrl = qiniuService.saveImage(file);
            if(fileUrl == null){
                return ToutiaoUtil.getJSONString(1, "图片上传失败");
            }
            return ToutiaoUtil.getJSONString(0, fileUrl);
        }catch (Exception e){
            logger.error("上传图片失败" + e.getMessage());
            return ToutiaoUtil.getJSONString(1, "图片上传失败");
        }
    }

如果上传到七牛云,就改成:

String fileUrl = qiniuService.saveImage(file);

相关的code:

package com.nowcoder.util;

import com.alibaba.fastjson.JSONObject;
import com.nowcoder.controller.LoginController;
import org.omg.CORBA.PUBLIC_MEMBER;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.security.MessageDigest;
import java.util.Map;

/**
 * Created by nowcoder on 2016/7/3.
 */
public class ToutiaoUtil {
    private static final Logger logger = LoggerFactory.getLogger(ToutiaoUtil.class);

    private static String[] IMAGE_FILE_EXT = {"png", "bmg", "jpg", "jpeg"};
    public static String IMAGE_DIR = "H:/toutiao/upload/";
    public static String IMAGE_DOMAIN = "http://192.168.0.100:8080/";

    public static boolean isAllowed(String fileExt){

        if(fileExt == null){
            return false;
        }

        for(String ext : IMAGE_FILE_EXT){
            if(ext.equals(fileExt)){
                return true;
            }
        }
        return false;
    }

    public static String getJSONString(int code){

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("code", code);
        return jsonObject.toString();
    }

    public static String getJSONString(int code, String msg){

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("code", code);
        jsonObject.put("msg", msg);
        return jsonObject.toString();
    }

    public static String getJSONString(int code, Map<String, Object> map){

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("code", code);
        for(Map.Entry<String, Object> m : map.entrySet()){

            jsonObject.put(m.getKey(), m.getValue());
        }
        return jsonObject.toString();
    }

    public static String MD5(String key) {
        char hexDigits[] = {
                ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘
        };
        try {
            byte[] btInput = key.getBytes();
            // 获得MD5摘要算法的 MessageDigest 对象
            MessageDigest mdInst = MessageDigest.getInstance("MD5");
            // 使用指定的字节更新摘要
            mdInst.update(btInput);
            // 获得密文
            byte[] md = mdInst.digest();
            // 把密文转换成十六进制的字符串形式
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            logger.error("生成MD5失败", e);
            return null;
        }
    }
}

七牛云的缩略图服务:https://developer.qiniu.com/dora/api/1279/basic-processing-images-imageview2

时间: 2024-11-02 00:14:33

5_1_图片上传的相关文章

jq upload图片上传代码

/* * 图片上传 * */ function postImgData() { $("#addFileInfo input[name='file']").change(function () { console.log($(this).val()) if (!$(this).val()) { return } var fileTyle = $(this).val().split("."); console.log(fileTyle); if (fileTyle[1]

[项目构建 五]babasport ajax图片上传及FastDFS入门案例.

今天来开始写图片上传的功能, 现在的图片上传都讲求 上传完成后立刻回显且页面不刷新, 这里到底是怎么做的呢? 当然是借助于ajax了, 但是ajax又不能提交表单, 这里我们还要借助一个插件: jquery.form.js剩下的一个是FastDFS, 那么什么是FastDFS呢? FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server).存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存储问题,特别适合以中小文

ckeditor4.5.1配置图片上传的方法

本篇博文主要面向初学者,一步一步地实现ckeditor的图片上传,欢迎各位大神指正. ckeditor的图片上传默认是关闭的,网上也有很多相关的教程,可是不是讲的不完整,就是版本太旧已经不适用.我写这篇博文主要面向初学者,有错误的地方欢迎指正. 截止本文撰写,ckeditor最新版本是4.5.1,我下载的版本是4.5.1standard,如果本文的方法不管用,请下载同一版本尝试. 1.开启图片上传界面 文件地址:ckeditor/plugins/image/dialogs/image.js 搜索

数往知来 JQuery 图片上传_水印 &lt;二十二&gt;

一.图片上传  :enctype='multipart/form-date 首先在进行文件上传时,添加form表单中的enctype属性指定enctype='multipart/form-date', 文件数据发送给服务端,并不是把文件路径发送给服务端了,它会随机生成一个分割字符串, 把每一个表单元素分割开 <form method='post' action='' enctype='multipart/form-date'> //这里的enctype是提交请求报文的报文体的一种编码格式, 默

微信端调取相册和摄像头,实现图片上传,并上传到本地服务器

在微信公众号网页开发时,遇到了图片上传的问题,查看了微信的开发者文档,里面的资料比较全.接着我们看一下整个的流程 1.config权限配置 $.ajax({ url:'wx_getConfig', type:'get', dataType:'json', async:false, success:function(data){ var appId = data[0].appId; var timestamp = data[0].timestamp; var nonceStr = data[0].

java图片上传(mvc)

最近有开始学起了java,好久没写文章了,好久没来博客园了.最近看了看博客园上次写的图片上传有很多人看,今天在一些篇关于java图片上传的.后台接收用的是mvc.不墨迹了,直接上图. 先看目录结构.idea开发. 一.图片上传还是使用的这款jq插件.前端部署这款插件,不用说了吧.效果图       二.前台代码只需要盖一个位置.因为是比较好用的插件.插件样式自行修改. 三.后台代码. 后面看不见的. 这个图片上传主要是自己写了几个函数.让图片储存更加方便.分成了年月日储存.但是后期遍历比较困难,

.net core CKEditor 图片上传

最近在玩 asp.net core,不想用UEditor,想使用CKEditor.故需要图片上传功能. 废话不多说,先上效果图: CKEditor 前端代码: <text id="content" name="content"></text> <script> CKEDITOR.replace('content'); </script> CKeditor config.js 配置代码:需要配置图片上传路径 CKEDIT

微信JS-SDK接口 + FLASK实现图片上传

最近在做一个项目从全球各地采集图片,考虑采用微信JS-SDK来简化开发.图片会首先上传到微信的服务器,返回一个id,然后根据这个id去微信服务器获取图片.微信提供可选择的压缩图片功能.图片首先上传到微信的服务器,可以保障较好的上传稳定性. 详细内容请参考微信的官方文档:微信JS-SDK说明文档 运行页面如下 HTML 在微信demo的基础上修改,见微信JS-SDK DEMO页面 增加图片的多次选择,多次上传,删除等功能 uploadImage.html <!DOCTYPE html> <

CKEditor图片上传实现详细步骤(使用Struts 2)

本人使用的CKEditor版本是3.6.3.CKEditor配置和部署我就不多说. CKEditor的编辑器工具栏中有一项"图片域",该工具可以贴上图片地址来在文本编辑器中加入图片,但是没有图片上传. "预览"中有一大堆鸟语,看得很不爽.可以打开ckeditor/plugins/image/dialogs/image.js文件,搜索"b.config.image_previewText"就能找到这段鸟语了,(b.config.image_prev