gpt4 book ai didi

java - 通过 REST API 的分段文件上传会损坏文件并增加文件大小

转载 作者:行者123 更新时间:2023-12-02 17:22:01 27 4
gpt4 key购买 nike

正在将文件(任何格式的 doc、docx、pdf、文本等)作为多部分表单/数据从 Postman 或应用程序 UI 上传到 REST API。文本文件上传正常。所有其他非文本格式都会损坏。我无法打开这些文件。

上传文件的大小急剧增加。检查以下服务器日志:

File size just before call to request.getRequestDispatcher().forward(): 27583
Controller, first line in method:39439

上传文件大小为27.3Kb

我猜测文件已损坏,因为附加到文件的其他数据。

Controller 方法是

@RequestMapping(value="/entity/{entity}/{entityId}/type/{type}/{derive}",method = RequestMethod.POST)
@ResponseBody
public String uploadFile(@RequestParam("file") MultipartFile multipartFile,@PathVariable("entity")String entity,@PathVariable("type")String type,@PathVariable("entityId")Long entityId,@PathVariable("derive") boolean derive) throws Exception

由于文本文件保存正确,其他文件也正确写入,不要认为写入文件的代码不正确。

获取输入流的代码

public String storeFile(MultipartFile multipartFile, String entity, Long id, String uploadType, boolean isDerive,String customName)
throws Exception
{
try
{
System.out.println(multipartFile.getSize());
String fileName = "";
String contentType = "";
if (multipartFile != null)
{
fileName = multipartFile.getOriginalFilename();
contentType = multipartFile.getContentType();
if (contentType == null)
{
contentType = "application/msword";
}
}
InputStream is = multipartFile.getInputStream();
String filePath = getFileName(entity, uploadType, id, fileName, isDerive,customName);
Helper.storeFile(is, filePath);
precedingPath = precedingPath.length() > 0 ? precedingPath + "/":"";
return precedingPath + filePath;
}
catch (WebException e)
{
e.printStackTrace();
throw e;
}
catch (Exception e)
{
e.printStackTrace();
throw new WebException(e.getMessage(), IHttpConstants.INTERNAL_SERVER_ERROR, e);
}
}

Helper.storeFile

public static File storeFile(InputStream is, String filePath) throws IOException {
try {
String staticRepoPath = null;

if (MasterData.getInstance().getSettingsMap().containsKey(Settings.REPO_LOCATION.toString())) {
staticRepoPath = MasterData.getInstance().getSettingsMap().get(Settings.REPO_LOCATION.toString());
} else {
throw new WebException("Invalid Settings");
}

byte[] buffer = new byte[is.available()];
is.read(buffer);

File targetFile = new File(staticRepoPath + File.separator + filePath);
@SuppressWarnings("resource")
OutputStream outStream = new FileOutputStream(targetFile);
outStream.write(buffer);
return targetFile;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

我的Ajax请求如下

var fd = new FormData();
//Take the first selected file
fd.append("file", document.actualFile);
//Generic AJAX call
CandidateService.ajax_uploadDocumentWithDocType($scope.candidate.id, fd, document.docType, function (error, json)

上传时的内容类型:

 var config = {headers:{'X-Auth-Token':authToken, 'Content-Type': undefined}, transformRequest: angular.identity};

有人知道如何解决这个问题并成功上传文件吗?

Q1) 为什么请求调度器和处理文件数据的 Controller 之间的文件大小会发生变化。

Q2) 文件大小的这种变化会不会是文件损坏的原因? Libre Office 导致一般输入/输出错误。

最佳答案

我想出了文件上传的问题。我在两者之间有一个 spring 过滤器,它正在将请求更改为 wrappedRequest。这会向多部分数据添加额外的数据并导致文件损坏。

关于java - 通过 REST API 的分段文件上传会损坏文件并增加文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41929633/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com