Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java API调用中文件扩展名的HTTP头参数_Java_File Upload_Apache Httpclient 4.x - Fatal编程技术网

Java API调用中文件扩展名的HTTP头参数

Java API调用中文件扩展名的HTTP头参数,java,file-upload,apache-httpclient-4.x,Java,File Upload,Apache Httpclient 4.x,是否可以将文件扩展名添加到HTTP头中 我开发了一个使用API调用发送文件的程序。 该文件将不限于.doc或.pdf,它也可以具有.exe或.zip扩展名 文件已成功上载到服务器,但文件扩展名似乎不正确,它将文件类型显示为data,而我需要另一种文件类型 下面是上传部分的示例代码源: HttpClient=newdefaulthttpclient(); HttpPost=新的HttpPost(“http://ServerName:Port/Anything/data"); //远程API UR

是否可以将文件扩展名添加到HTTP头中

我开发了一个使用API调用发送文件的程序。 该文件将不限于.doc或.pdf,它也可以具有.exe或.zip扩展名

文件已成功上载到服务器,但文件扩展名似乎不正确,它将文件类型显示为data,而我需要另一种文件类型

下面是上传部分的示例代码源:

HttpClient=newdefaulthttpclient();
HttpPost=新的HttpPost(“http://ServerName:Port/Anything/data");  //远程API URL
String filepath=“C://User//test/”;
字符串file1=filepath.concat(文件);
System.out.println(“发送文件”);
FileBody bin=newfilebody(新文件(file1));//从目录中获取文件
HttpEntity reqEntity=MultipartEntityBuilder.create()
.addPart(“显示名称”,(内容体)bin)
.build();
post.addHeader(“文件名”,file1);
post.setEntity(reqEntity);//邮寄



文件正文是否也会读取文件扩展名?

使用
(HttpServletRequest)request.getHeader(“内容处置”)
从标题列表中提取
内容处置
标题。这将使文件名在最后显示为
contentdisposition:formdata;name=“uploadedfile”;filename=“file.ext”

从这里可以提取文件类型

您也可以通过以下方式完成:

String fileName = uploadedFile.getFileName();
String mimeType = getServletContext().getMimeType(fileName);
if (mimeType.startsWith("text/")) {
    // It's a text.
}else if(mimeType.startsWith("image/")){
    // It's an image.
}

希望有帮助。

在编写本文时,您可以找到
文件体的三个构造函数的源代码

如果未指定
contentType
,则默认值为
contentType.default\u BINARY

正是内容类型定义了“文件类型”,因为并非每个操作系统都使用文件扩展名


如果您在Linux系统中运行,请参阅检索文件的mime类型。
还有一个问题

contentType
中拥有内容类型后,使用正确的构造函数:
newfilebody(新文件(file1),contentType.create(contentType))
您可能还需要添加编码信息,请参阅


您没有指定正在运行的服务器,但在开始检测文件的mime类型之前,您可以做一个快速测试,将硬编码的mime类型放入请求中。
只需将
FileBody
对象构造为

FileBody bin = new FileBody(new File(file1), ContentType.create("image/png"));

为了指定文件类型,即Mime类型,您应该使用
FielBody
的2个参数或3个参数构造函数之一,而不是您已经使用的一个参数构造函数

根据您的文件类型,它应该如下所示:

FileBody bin=newfilebody(新文件(file1),ContentType.DEFAULT\u二进制);

没有从服务器返回错误代码,文件到达了我的服务器在我添加代码后问题仍然一样,有什么想法吗?@攻击想法很简单。您负责提供“文件扩展名”,而不是系统。没办法。@MargaretBloom-在我阅读文件的时候,我还需要包括文件扩展名吗?是这样吗?@attack记录您自己的mime类型以及HTTP文件上载工作原理(尤其是内容处置头)。HttpClient框架包含文件名(正如您从源代码中看到的那样),但不会推断mime类型:由调用方提供一个或将使用默认二进制文件(并且将在服务器端检测到“数据”)。我已经链接了两个关于如何检索mime类型的问题。如果你想做一个快速测试,只需使用“image/png”并查看服务器报告。@MargaretBloom-如果我想做一个快速检查,我应该把“image/png”放在哪里?它可以检测到ASCII文件,但其他文件类型的检测失败,有什么想法吗?@没有a和服务器端代码的攻击很难分辨。
FileBody bin = new FileBody(new File(file1), ContentType.create("image/png"));