Проблема с именем формы данных - PullRequest
0 голосов
/ 30 мая 2018

У меня есть угловое приложение, которое загружает файлы, используя мой API.У меня есть немного кода, который выглядит следующим образом:

var url = __env.apiUrl + 'documents/' + containerName + '/' + reference;
var formData = new FormData();            
var request = {
    method: 'POST',
    url: url,
    data: formData,
    headers: {
        'Content-Type': undefined
    }
};

formData.append('file', file);
formData.append('metadata', JSON.stringify(metadata));

return $http(request).then(function (response) {
    SimpleCache.remove(__env.apiUrl + '/documents');
    listDirectiveService.refresh('document');
    ngNotify.set('Your document was created.');
}, notifications.handleError).finally(function () {                
    onComplete();
});

На моей стороне API, c # используется для получения файла выглядит следующим образом:

if (!request.Content.IsMimeMultipartContent("form-data")) throw new HttpResponseException(request.CreateResponse(HttpStatusCode.UnsupportedMediaType));
Valiate(containerName, directoryName);

var filesReadToProvider = await request.Content.ReadAsMultipartAsync();

// We assume that the form data name is file and metadata respectively
var fileStream = filesReadToProvider.Contents.SingleOrDefault(m => m.Headers.ContentDisposition.Name.Equals("\"file\"", StringComparison.OrdinalIgnoreCase));
var metaDataStream = filesReadToProvider.Contents.SingleOrDefault(m => m.Headers.ContentDisposition.Name.Equals("\"metadata\"", StringComparison.OrdinalIgnoreCase));

if (fileStream == null) throw new ArgumentNullException(nameof(fileStream));
if (metaDataStream == null) throw new ArgumentNullException(nameof(metaDataStream));

Это работает, нопроблема заключается в имени ContentDisposition .Если вы заметили, он ищет "файл" вместо файл .Кто-нибудь знает, почему у него есть дополнительные кавычки?

1 Ответ

0 голосов
/ 11 ноября 2018

Я так и не узнал, почему это происходит, поэтому я просто сделал свою функцию такой:

public async Task<string> CreateAsync(HttpRequestMessage request, string containerName, string directoryName, string existingUrl = "")
{
    if (!request.Content.IsMimeMultipartContent("form-data")) throw new HttpResponseException(request.CreateResponse(HttpStatusCode.UnsupportedMediaType));
    Valiate(containerName, directoryName);

    var filesReadToProvider = await request.Content.ReadAsMultipartAsync();

    // We assume that the form data name is file and metadata respectively
    var fileStream = filesReadToProvider.Contents.SingleOrDefault(m => 
        m.Headers.ContentDisposition.Name.Equals("\"file\"", StringComparison.OrdinalIgnoreCase) ||
        m.Headers.ContentDisposition.Name.Equals("file", StringComparison.OrdinalIgnoreCase));
    var metaDataStream = filesReadToProvider.Contents.SingleOrDefault(m =>
        m.Headers.ContentDisposition.Name.Equals("\"metadata\"", StringComparison.OrdinalIgnoreCase) ||
        m.Headers.ContentDisposition.Name.Equals("metadata", StringComparison.OrdinalIgnoreCase));

    if (fileStream == null) throw new ArgumentNullException(nameof(fileStream));
    if (metaDataStream == null) throw new ArgumentNullException(nameof(metaDataStream));

    // Upload our file
    var fileBytes = await fileStream.ReadAsByteArrayAsync();
    var mediaType = fileStream.Headers.ContentType.MediaType;
    var friendlyFileName = fileStream.Headers.ContentDisposition.FileName.Replace("\"", string.Empty);
    var fileName = $"{Guid.NewGuid()}{Path.GetExtension(friendlyFileName)}";
    var directory = GetDirectory(containerName, directoryName);
    var fileUrl = await Upload(directory, fileName, mediaType, fileBytes);

    // Add our metadata
    var metadata = await GetMetadataFromMemoryStreamAsync(metaDataStream);
    metadata.Add("fileName", friendlyFileName);
    metadata.Add("directory", directoryName);
    metadata.Add("created", DateTime.UtcNow.ToString(CultureInfo.InvariantCulture));
    await AddFileMetaDataAsync(fileUrl, metadata);

    // Delete any existing file
    if (!string.IsNullOrEmpty(existingUrl) && fileUrl != existingUrl) await DeleteAsync(containerName, directoryName, existingUrl);

    return fileUrl;
}

Просто, чтобы охватить все базы.Это не самое лучшее, но должно работать нормально.

...