泽西岛多部分 getFileName() 具有串联路径

Jersey multipart getFileName() has concatenated path

提问人:Hack-R 提问时间:10/16/2016 最后编辑:Hack-R 更新时间:6/8/2017 访问量:1488

问:

我正在尝试使用 Java + Jersey + multipart + Tomcat + HTML/CSS/JS 上传文件。

出于测试目的,我只是想从我的下载文件夹中上传一些任意文件并将其写入我的桌面。

我唯一的问题似乎是,当我尝试以某种方式获取上传文件的文件名时,我得到了一个带有文件名的连接路径(“C:UsersHackRDownloadsstackexample.csv”)。fileDetail.getFileName();

我的计划(遵循教程)是将目标目录附加到文件名之前:

    String uploadedFileLocation = "C:/Users/HackR/Desktop/"
            + fileDetail.getFileName();

并把它写出来。但是,它最终尝试将其写入如下内容:

C:/Users/HackR/Desktop/C:UsersHackRDownloadsstackexample.csv

这实际上只是在我的桌面上创建了一个 0kb 的文件。C

我怎样才能以我需要的方式获得这个例子的实际文件名(即没有路径)?

这是我的整个文件上传服务:

package com.mkyong.rest;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataParam;

@Path("/file")
public class UploadFileService {

    @POST
    @Path("/upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFile(
            @FormDataParam("file") InputStream uploadedInputStream,
            @FormDataParam("file") FormDataContentDisposition fileDetail) {

        String uploadedFileLocation = "C:/Users/HackR/Desktop/"
                + fileDetail.getFileName();

        // save it
        writeToFile(uploadedInputStream, uploadedFileLocation);

        String output = "File uploaded to : " + uploadedFileLocation;

        return Response.status(200).entity(output).build();

    }

    // save uploaded file to new location
    private void writeToFile(InputStream uploadedInputStream,
            String uploadedFileLocation) {

        try {
            OutputStream out = new FileOutputStream(new File(
                    uploadedFileLocation));
            int read = 0;
            byte[] bytes = new byte[1024];

            out = new FileOutputStream(new File(uploadedFileLocation));
            while ((read = uploadedInputStream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            out.flush();
            out.close();
        } catch (IOException e) {

            e.printStackTrace();
        }

    }

}
爪哇 球衣

评论

0赞 yeoman 10/16/2016
你能说说你是哪个平台吗?视窗10?因为这样可以更容易地找到问题的根源,我猜这源于eclipse:)使用的系统浏览器引擎
0赞 Hack-R 10/16/2016
@yeoman 是的,这是 Windows 10,谢谢。

答:

1赞 yeoman 10/16/2016 #1

串联的文件名是使用 Eclipse 内部浏览器的结果,它可能无法正确支持您的 HTML、CSS、JS 等,尤其是在您使用 Angular JS 或任何 webkit 技术时,即使是间接的。

eclipse 内部浏览器实际上只是一个原生的浏览器控件:)在 Mac 上,这使得它使用 Safari,其引擎是 webkit。

使用 Safari 或 Chrome 进行工作,这仍然非常相似,因为它基于 webkit 的一个相对较新的分支,那么它应该在 Mac 上的 eclipse 内部浏览器中工作,太:)

正如您的帖子所暗示的那样,您使用的是 Windows 机器,因此您需要使代码与已安装的 Internet Explorer 一起使用,因为这是 eclipse 在 Windows 上使用的。

无论如何,祝你好运!

评论

0赞 Hack-R 10/16/2016
谢谢。我相信你的回答指的是我问题的原始标题。对此,我深表歉意。这个标题来自我昨天写的一个未发表的问题,它与这个问题不符。我已经修复了标题。再次,对于造成的混乱,我深表歉意。
0赞 yeoman 10/16/2016
啊,好多了!:D
0赞 Hack-R 10/16/2016
好吧,所以我认为这与 webkit 或浏览器没有任何关系,但事实证明你是对的——它确实如此。这个问题只发生在愚蠢的内部浏览器上。Chrome 不会发生这种情况。我很惊讶,因为我只是在文件上传页面中使用纯 HTML,除了我使用 CSS 来设置上传按钮的样式并且我使用 Angular JS 来显示错误。哦,我猜是因为我的 styles.css 文件中有一些 webkit 过滤器 CSS 语句必须以某种方式弄乱内部 Eclipse 浏览器(Internet Explorer)。
0赞 yeoman 10/16/2016
这样的经典。如此不幸,因为可用的内部浏览器实际上是一件好事:)