【问题标题】:How to get real path InputStream file in Java Rest API如何在 Java Rest API 中获取真实路径 InputStream 文件
【发布时间】:2020-01-29 21:14:08
【问题描述】:

我有一个 Java Rest API Post 方法,它将图像 (InputStream) 作为参数发送,我必须将其保存在 Oracle 的 blob 列中。

我需要获取此 InputStream 的完整路径(真实路径)才能将此图像保存在数据库中。 我的代码如下。

@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
                @FormDataParam("file") InputStream uploadedInputStream,
                @FormDataParam("file") FormDataContentDisposition fileDetail) {
String UPLOAD_FOLDER = "c:/uploadedFiles/"; // my rest api does not have this file, how to get at runtime?    
String uploadedFileLocation = UPLOAD_FOLDER + fileDetail.getFileName(); // this line is ok

我想做这样的事情:

String UPLOAD_FOLDER = uploadedInputStream.getRealPathName();

String UPLOAD_FOLDER = fileDetail.getRealPathName();

【问题讨论】:

  • 大多数浏览器不再发送他们上传文件的完整原始文件路径(出于安全/隐私原因)。他们只会发送没有路径的文件名。你为什么需要那个?
  • InputStream 很可能不是FileInputStream,并且很可能与文件无关。这篇 SO 帖子将帮助您了解如何将 InputStream 写入 Oracle 中的 BLOB 列:stackoverflow.com/questions/8348427/…
  • 这个 post 方法将通过 android 应用程序接收图像。我需要将此文件写入数据库。文件处理方法(new File("path/filename.jpg")、new FileInputStream("path/filename.jpg") 等)要求提供完整路径

标签: java rest inputstream fileinputstream bufferedinputstream


【解决方案1】:

我通过将输入流转换为字节数组解决了这个问题。我将 byte[] 转发到数据库持久化方法。我的代码如下:

public byte[] toByteArray(InputStream is) throws IOException{
    ByteArrayOutputStream baus = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int len;
    while((len= is.read(buffer)) != -1){
        baus.write(buffer, 0, len);
    }
    return baus.toByteArray();
}

@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
                @FormDataParam("file") InputStream uploadedInputStream,
                @FormDataParam("file") FormDataContentDisposition fileDetail) {
    ...
    byte[] b = toByteArray(uploadedInputStream);
    business.saveUploadedFileInDatabase(b);
    ...
}

public boolean uploadFile(byte[] b) throws SQLException, IOException{
    ...
    PreparedStatement ps = conn.prepareStatement("INSERT INTO TABLE_IMAGE_TEST (CODE, IMAGE) VALUES (?, ?)");
    pstmt.setLong(1, 1L);
    pstmt.setBytes(2, b);
    pstmt.execute();
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    相关资源
    最近更新 更多