jersey上传图片

本文来自于我的个人博客:jersey上传图片

今天刚好要做一个用户上传图片的功能,但是需要通过restful api上传,于是通过查询资料以及不断尝试,终于走出了这个图片上传一直报错的困扰,现在将详细代码贴上,希望对后来者有帮助:

客户端:

依赖包:

jersey-client

jersey-multipart

源码:

package com.speakword.client;

import java.io.File;

import javax.ws.rs.core.MediaType;

import org.apache.log4j.Logger;

import com.google.gson.Gson;
import com.speakword.entity.OutputMessage;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.multipart.FormDataMultiPart;
import com.sun.jersey.multipart.file.FileDataBodyPart;

public class FileManageApiClient {
    
    private static Logger log = Logger.getLogger(FileManageApiClient.class);
    
    private static String url = "";
    private static final String uploadUserPic = "/upload/uploadUserPic";
    private static Client client;
    public static void init(String path) {
        url = path;
        client = Client.create();
        client.setConnectTimeout(5000);
        client.setReadTimeout(5000);
    }
    
    public static OutputMessage uploadUserPic(String file,
           Long userid, String suffix) {
        String picPath = url + uploadUserPic+"?userid=" +userid;
        WebResource r = client.resource(picPath);
        try {
            File f = new File(file);
            //构建一个form data体
            FileDataBodyPart fdp = new FileDataBodyPart("file", f, MediaType.APPLICATION_OCTET_STREAM_TYPE);
            FormDataMultiPart formDataMultiPart = new FormDataMultiPart();
            formDataMultiPart.bodyPart(fdp);
            ClientResponse response = r.type(MediaType.MULTIPART_FORM_DATA)
                    .post(ClientResponse.class, formDataMultiPart);
            String result = response.getEntity(String.class);
            if(null != result && !"".equals(result) && response.getStatus() == 200) {
                Gson gson = new Gson();
                OutputMessage om = gson.fromJson(result, OutputMessage.class);
                return om;
            } else {
                log.error("上传图片出错..."+file+" " + userid + ", " + result);
            }
        } catch(Exception e) {
            log.error("上传图片失败",e);
        }
        return null;
    }
}

服务端:

依赖包:

jersey-core

jersey-server

jersey-multipart

mimepull

jersey resource代码:

package com.sns.resource;

import java.io.IOException;
import java.io.InputStream;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.UriInfo;

import org.apache.log4j.Logger;

import com.google.gson.JsonObject;
import com.sns.business.service.UploadImageService;
import com.sun.jersey.multipart.FormDataBodyPart;
import com.sun.jersey.multipart.FormDataMultiPart;

/**
 * 图片上传
 * @author lifeix
 *
 */
@Path("/upload")
public class UploadImageResource {

    private static Logger log = Logger.getLogger(UploadImageResource.class);
    
    @POST 
    @Path("/uploadUserPic")
    @Consumes(MediaType.MULTIPART_FORM_DATA)  // 消费注解必须是这个类型
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    public String uploadImg(FormDataMultiPart form, @Context UriInfo uri, @Context HttpServletRequest request){
        
        JsonObject json = new JsonObject();
        String suffix = "png";
        if(form == null) {
            json.addProperty("msg", "参数错误");
            json.addProperty("code", 304);
            return json.toString();
        }
        FormDataBodyPart part = form.getField("file");
        InputStream is = part.getValueAs(InputStream.class);
        try {
            if(is.available() == 0) {
                json.addProperty("msg", "数据流为0");
                json.addProperty("code", 304);
                return json.toString();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        MultivaluedMap<String, String> mm = uri.getQueryParameters();
        
        Long userid = Long.parseLong(mm.getFirst("userid"));
        return UploadImageService.uploadUserPic(is, userid, request, suffix);
    }
    
}

上传文件处理类:

package com.sns.business.service;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

import com.google.gson.Gson;
import com.google.gson.JsonObject;

public class UploadImageService {
    
    private static Logger log = Logger.getLogger(UploadImageService.class);
    
    private static final String uploadPath = "image/bigger/%s/server/upload/%s/%s"; //1.来源  2.时间  3.pic
    
    /**
     * 上传用户头像
     * @param is
     * @param userid
     * @param request
     * @param suffix
     * @return
     */
    public static String uploadUserPic(InputStream is, Long userid, HttpServletRequest request, String suffix) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        String time = sdf.format(new Date());
        String us = "pic";
        String path = uploadPath;
        path = String.format(path, "ts",time,us);
        String newPath = "d:/blogphoto/" + path;
        File file = new File(newPath);
        if(!file.exists()) {
            file.mkdirs();
        }
        String fileName = System.currentTimeMillis()+"u"+userid+"." + suffix;
        newPath =  newPath + "/" + fileName;
        file = new File(newPath);
        JsonObject json = new JsonObject();
        if(!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                log.error("创建上传文件出错---" + path+"/"+fileName,e);
                json.addProperty("msg", "上传文件失败");
                json.addProperty("code", 500);
                return json.toString();
            }
        }
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(file,true);
        } catch (FileNotFoundException e) {
            log.error("构建输出流出错---" + path,e);
            json.addProperty("msg", "上传文件失败");
            json.addProperty("code", 500);
            return json.toString();
        } 
        FileChannel fc = null;
        try {
            fc = fos.getChannel();
        } catch(Exception e) {
            log.error("获取文件通道出错---" + path,e);
            json.addProperty("msg", "上传文件失败");
            json.addProperty("code", 500);
            return json.toString();
        }
        //使用java nio上传图片
        ByteBuffer buffer = null;
        try {
            buffer = ByteBuffer.allocateDirect(is.available());
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        byte[] bb = null;
        try {
            bb = new byte[is.available()];
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        try {
            while(is.read(bb) > 0) {
                buffer.put(bb);
                buffer.flip();
                fc.write(buffer);
                buffer.clear();
            }
            json.addProperty("msg", "上传成功");
            json.addProperty("code",200);
            json.addProperty("filePath", path+"/"+fileName);
        } catch (IOException e) {
            log.error("写入文件出错---" + path +"/"+fileName,e);
            json.addProperty("msg", "上传文件失败");
            json.addProperty("code", 500);
        } finally {
            if(fc != null) {
                try {
                    fc.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        Gson gson = new Gson();
        String str = gson.toJson(json);
        return str;
    }
    
}

jersey上传图片

时间: 2024-10-22 06:32:37

jersey上传图片的相关文章

新建一个tomcat服务器,spring+jersey完成上传图片的实现

万年不变开头,添加依赖 <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-client --> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.19.4</version> </depen

Jersey后端服务接收ajax前端的图片上传

近期的项目里需要在前端上传图片后端接收处理.前端JSP页面使用Ajax上传图片后端使用Jersey框架提供restful接口接收处理图片. 一.前端的处理 jsp页面中图片上传没有使用form表单而是直接使用file类型的input控件 <input type="file" name="file" class="inpTxtA" value="" id="appLogo"/> <input

使用Jersey构建图片服务器 有回显图片功能

1.前台界面代码 <form id="jvForm" action="add.do" method="post" enctype="multipart/form-data"> <table> <tr> <td width="20%" class="pn-flabel pn-flabel-h"></td> <td width

搭建一个Tomcat,作为图片服务器,异步上传图片

1.图片服务器Tomcat的设置  tomcat/conf/web.xml中内容更改,将tomcat设置为可以读写 <servlet>     <servlet-name>default</servlet-name>             <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>         <init-param>   

java异步上传图片

第一步:引入需要的js <script src="/res/common/js/jquery.js" type="text/javascript"></script><script src="/res/common/js/jquery.form.js" type="text/javascript"></script><!----用来模拟form表单提交数据的组件--->

使用Jersey上传文件

采用jquery.form.js异步上传图片,并结合<form>表单 <script type="text/javascript"> //采用jquery.form.js异步上传图片,并结合<form>表单 function uploadPicture() { var options = { //请求路径 url : "/upload/uploadPic.do", dataType : "json", type

本地上传图片预览

<!DOCTYPE html > <html > <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>图片上传本地预览,获得图片的base64(可压缩)</title> <style type="text/css"> .upload_image {

java web应用用户上传图片的存储地址

原来工程的上传图片存储地址在web应用的目录下,并且是硬编码到其中的: 每次使用maven tomcat:redeploy以后,这个目录就没有了. 现在想要把上传图片的位置移动到tomcat的webapps目录中专门存放图片的一个目录下. 即,新建的一个images目录用来存放web应用的图片们. 这样就把工程和用户上传图片分离了,以后在redeploy时也不用预先备upload目录,然后再拷贝回去,因而在web应该更新时比较方便些.此外,还想改变文件路径被硬编码到java文件中的现状,所以将文

微信JS-SDK实现上传图片功能

最近在项目开放中,有一个在微信WEB项目中上传图片的需求,一开始使用了传统的<input type="file">的方式去实现,但是后面发现在使用这种传统模式时会由于手机系统的差异而导致一系列的问题,后改用微信JSSDK的方式来实现. 总的来说,利用JSSDK来实现该功能一共分为四步. 1. 调用wx.config(),初始化jssdk的配置,并在jsApiList中配置上传图片需要的四个api('chooseImage','previewImage','uploadIma