当前位置: 首页 > 面试题库 >

从REST Web服务向客户端发送文件的正确方法是什么?

轩辕煜
2023-03-14
问题内容

我刚刚开始开发REST服务,但是遇到了一个困难的情况:将文件从REST服务发送到客户端。到目前为止,我已经掌握了如何发送简单数据类型(字符串,整数等)的窍门,但是发送文件却是另一回事,因为存在太多的文件格式,我什至不知道从哪里开始。我的REST服务是在Java上完成的,我正在使用Jersey,我正在使用JSON格式发送所有数据。

我已经读过有关base64编码的信息,有人说这是一种好技术,而另一些人则说这不是因为文件大小问题。正确的方法是什么?这是我项目中一个简单的资源类的样子:

import java.sql.SQLException;
import java.util.List;

import javax.ws.rs.GET;
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.Request;
import javax.ws.rs.core.UriInfo;

import com.mx.ipn.escom.testerRest.dao.TemaDao;
import com.mx.ipn.escom.testerRest.modelo.Tema;

@Path("/temas")
public class TemaResource {

    @GET
    @Produces({MediaType.APPLICATION_JSON})
    public List<Tema> getTemas() throws SQLException{

        TemaDao temaDao = new TemaDao();        
        List<Tema> temas=temaDao.getTemas();
        temaDao.terminarSesion();

        return temas;
    }
}

我猜发送文件的代码是这样的:

import java.sql.SQLException;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/resourceFiles")
public class FileResource {

    @GET
    @Produces({application/x-octet-stream})
    public File getFiles() throws SQLException{ //I'm not really sure what kind of data type I should return

        // Code for encoding the file or just send it in a data stream, I really don't know what should be done here

        return file;
    }
}

我应该使用哪种注释?我见过有人建议@GET使用@Produces({application/x-octet- stream}),这是正确的方法吗?我要发送的文件是特定的文件,因此客户端不需要浏览文件。谁能指导我如何发送文件?我是否应该使用base64对其进行编码以将其作为JSON对象发送?还是不需要将编码作为JSON对象发送?感谢您提供的任何帮助。


问题答案:

我不建议在base64中编码二进制数据并将其包装在JSON中。它只会不必要地增加响应的大小并使速度变慢。

只需使用GET并application/octect- stream使用的工厂方法之一即可提供文件数据javax.ws.rs.core.Response(JAX-
RS API的一部分,因此您不会被锁定到Jersey):

@GET
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getFile() {
  File file = ... // Initialize this to the File path you want to serve.
  return Response.ok(file, MediaType.APPLICATION_OCTET_STREAM)
      .header("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"" ) //optional
      .build();
}

如果您没有实际的File对象,但是InputStream,也Response.ok(entity, mediaType)应该能够处理该对象。



 类似资料:
  • 我正在从服务器向客户端发送自定义web套接字帧。我成功地实现了无缝握手,但发送常规文本帧会给我带来问题(客户端的消息未被接收)。这是我发送的: 数据发送正确(握手成功,jj值为6)。我的代码基于这里的解释,如何在服务器端发送和接收WebSocket消息?。 我的客户非常简单,我只是为了完成发布: 我从客户端获得的Web套接字版本是13。 知道为什么握手有效而普通文本无效吗?

  • 本文向大家介绍详解Java向服务端发送文件的方法,包括了详解Java向服务端发送文件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java向服务端发送文件的方法,供大家参考,具体内容如下 结果: 以上就是的全部内容,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我正在创建我的产品,并与这个问题。有一天,我设置了Socket.io,一切都很好。第二天,我将服务器和客户端从http迁移到HTTPS。迁移后客户端和服务器端仍然连接,但不能从客户端发射到服务器,从服务器发射到客户端。 我的ssl证书位于和中,它们加载正确。运行在上的服务器 我的示例react组件。我的react应用程序运行在上。HTTPS连接良好,工作良好。 我该怎么办?也许我在中错误地使用了s

  • 问题内容: 我将实现类似于Facebook通知和此网站的内容(StackOverflow的通知会通知我们是否有人为我们的问题写评论/答案等)。请注意,用户将使用我的应用程序作为网站而不是移动应用程序。 我遇到以下获取结果的答案,但我需要推送结果而不是获取结果。 根据建议,我在实体类中创建了一个简单方法,并向其中添加了@PostPersist,但此方法不起作用,因此基于此答案,我添加了persist