Part.Write(...)将零件标题的文件名部分写入文件?

时间:2018-07-17 13:38:25

标签: java c# tomcat multipartform-data dotnet-httpclient

在我的Tomcat Servlet中,我有如下代码

List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName())).collect(Collectors.toList());

...

for (Part part: request.getParts())
{
    ...
    String partname = part.getName();
    LOGGER.log(Level.SEVERE, "part name " + partname);
    // Logs: FileManager.handle_upload part name file
    String headerNames = String.join(",", part.getHeaderNames());
    LOGGER.log(Level.SEVERE, "header names " + headerNames);
    // Logs: FileManager.handle_upload header names content-disposition
    for (String headerName : part.getHeaderNames())
    {
        LOGGER.log(Level.SEVERE, headerName + ": " + String.join(",",part.getHeaders(headerName)));
    }
    // Logs 1 line: content-disposition: form-data; name=file; filename="DESIGNATION OF ENACTMENTS ACT CAP. 97 L.F.N. 1990 ACT CAP. D8 L.F.N. 2004
    // Note no ending "
    ...
    part.write(getIndexerDataDirectory() + File.separator + sc1FileEntry.FileUUID);
    ...
}

写入的文件以一些换行符开头,后跟文件名部分

File Screenshot

这是意外的-我希望文件以屏幕快照中可见的第一个html标签开头。

从前端,我有一个使用httpClient的C#Winforms客户端,如下所示:-

        HttpClient httpClient = null;
        try
        {
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            httpClient = new HttpClient();
            httpClient.Timeout = new TimeSpan(0,0,10);
            httpClient.DefaultRequestHeaders.Add("APIKey",APIKey);
            httpClient.DefaultRequestHeaders.Add("IndexID", Index.IndexID.ToString());
            httpClient.DefaultRequestHeaders.Add("IndexUUID", Index.IndexUUID);

            foreach (SC1File file in Files)
            {
                    MultipartFormDataContent formData = new MultipartFormDataContent();
                    foreach(StoredField field in file.StoredFields)
                    {
                        //MessageBox.Show("Fieldname " + field.FieldName);
                        //None of these are 'filename'
                        formData.Add(new StringContent(field.FieldValue),field.FieldName);
                    }
                    MessageBox.Show("FileContents", file.file_contents);
                    // Starts with html tags as expected
                    MessageBox.Show("FileName", file.file_name);
                    // Displays title correctly
                    // Which is 
                    // DESIGNATION OF ENACTMENTS ACT CAP. 97 L.F.N. 1990 ACT CAP. D8 L.F.N. 2004
                    return;
                    formData.Add(new ByteArrayContent(Encoding.UTF8.GetBytes(file.file_contents)),"file",file.file_name);
                    HttpResponseMessage response = httpClient.PostAsync(endpoint, formData).Result;
                if (response.IsSuccessStatusCode)
                {
                    return;
                }
                else
                {
                    throw new Exception("Request failed: " + response.StatusCode + " - " + response.Content.ReadAsStringAsync().Result);
                }
        }
        } finally 
        {
            httpClient.Dispose();
        }

如您所见,我没有手动传递'filename'属性,并且我已经测试过我的文件内容实际上并不以此开头;文件名* =。看来httpClient是自己添加的。我在这里做错什么了吗,或者是一种控制这种行为的方法?

0 个答案:

没有答案