Я отправляю изображение на сервер через REST API, используя составные форм-данные, но оно повреждено - PullRequest
0 голосов
/ 01 октября 2018

Из приведенного ниже кода я конвертирую изображение в байтовый массив, а затем отправляю его на сервер через многокомпонентные данные, используя метод публикации REST API.Он отправляет bytearray на сервер, но когда я получаю одно и то же изображение с сервера, я получаю сообщение о том, что формат изображения поврежден.Я не могу понять ошибку.

public static async Task < HomeWorkResponse > CreateHomeWork(HomeWorkRequest homeWork, UserData user) {
    try {
        MultipartFormDataContent Mfdc = new MultipartFormDataContent();
        System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient();
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        MultipartFormDataContent form = new MultipartFormDataContent("Upload----" + DateTime.Now.ToString(CultureInfo.InvariantCulture));
        List < KeyValuePair < string,
        string >> Post_parameters = null;
        string token = "";
        var result = await ServerMethods.GetTokenForTLE();
        if (result != null && !string.IsNullOrEmpty(result.response.token)) {
            token = result.response.token;
        }

        //Convert Image into bytearray

        for (int i = 0; i < homeWork.attachmentspath.Count; i++) {
            Mfdc = new MultipartFormDataContent();
            StorageFile sfs = await StorageFile.GetFileFromPathAsync(homeWork.attachmentspath[i]);
            FileStream fileStream = null;
            byte[] imageByteArray = null;
            using(var stream = await sfs.OpenReadAsync()) {
                imageByteArray = new byte[stream.Size];
                using(var reader = new DataReader(stream)) {
                    await reader.LoadAsync((uint) stream.Size);
                    reader.ReadBytes(imageByteArray);
                }
            }

            //Add that bytearray into http content

            HttpContent content = new ByteArrayContent(imageByteArray, 0, imageByteArray.Length);
            Mfdc.Add(content);
            content.Headers.ContentType = MediaTypeHeaderValue.Parse(sfs.ContentType);
            content.Headers.ContentDisposition = new ContentDispositionHeaderValue("filename");
            content.Headers.ContentDisposition.FileName = sfs.DisplayName;
            Mfdc.Headers.ContentType = MediaTypeHeaderValue.Parse(sfs.ContentType);
            form.Add(Mfdc, i.ToString(), homeWork.attachments[i]);
        }

        //Add different types of data in form data

        form.Add(new StringContent(user.user_id), "user_id");
        form.Add(new StringContent(user.user_session_id), "session_id");
        form.Add(new StringContent(homeWork.subject_id), "subject_id");
        form.Add(new StringContent(homeWork.section_id), "section_id");
        form.Add(new StringContent(homeWork.class_id), "class_id");
        form.Add(new StringContent(user.school_id), "school_id");
        form.Add(new StringContent(homeWork.assignment_title), "title");
        form.Add(new StringContent(homeWork.content), "content");
        form.Add(new StringContent("class-section"), "channel");
        form.Add(new StringContent("mobile"), "origin");
        form.Add(new StringContent("homework"), "type");
        form.Add(new StringContent(""), "homework_id");
        form.Add(new StringContent(homeWork.target_date), "target_date");
        form.Add(new StringContent(homeWork.section_id), "classsec_ids");
        form.Add(new StringContent(""), "group_ids");
        form.Add(new StringContent(""), "file_list");
        form.Add(new StringContent("class"), "assign_to");
        form.Add(new StringContent(token), "token");

        //send the data on server through REST API using post method

        System.Net.Http.HttpResponseMessage response = await httpClient.PostAsync(string.Format(UrlHelpers.TLE_TEACHER_CREATE_HOMEWORK_URL), form);
        response.EnsureSuccessStatusCode();
        httpClient.Dispose();

        string sd = response.Content.ReadAsStringAsync().Result;
        var DeserializeObject = JsonConvert.DeserializeObject < HomeWorkResponse > (sd);
        return (HomeWorkResponse) Convert.ChangeType(DeserializeObject, typeof(HomeWorkResponse));

    }
    catch(Exception e) {

}
}

Из этого кода я конвертирую свое изображение в байтовый массив из моей системы

for (int i = 0; i < homeWork.attachmentspath.Count; i++) {
    Mfdc = new MultipartFormDataContent();
    StorageFile sfs = await StorageFile.GetFileFromPathAsync(homeWork.attachmentspath[i]);
    FileStream fileStream = null;
    byte[] imageByteArray = null;
    using(var stream = await sfs.OpenReadAsync()) {
        imageByteArray = new byte[stream.Size];
        using(var reader = new DataReader(stream)) {
            await reader.LoadAsync((uint) stream.Size);
            reader.ReadBytes(imageByteArray);
        }
    }

И это код в Java, который использовался командой Android иих изображения загружены успешно

ArrayList<String> stringArrayList = new ArrayList<>();
stringArrayList = sourceFileUr;
// defaultHttpClient
InputStream inputStream;
File sourceFile;
byte[] data;
MultipartEntity entity = new MultipartEntity();
JSONObject jsonObject = new JSONObject();
InputStreamBody inputStreamBody;
if (stringArrayList != null && stringArrayList.size() > 0) {
    String allFile = "";

    for (int i = 0; i < stringArrayList.size(); i++) {
        String fileName = stringArrayList.get(i).substring(stringArrayList.get(i).lastIndexOf("/") + 1);
        String Fullpath = stringArrayList.get(i);
        sourceFile = new File(Fullpath);
        inputStream = new FileInputStream(sourceFile);
        data = IOUtils.toByteArray(inputStream);
        inputStreamBody = new InputStreamBody(new ByteArrayInputStream(data), fileName);
        entity.addPart("" + i, inputStreamBody);
        //  entity.addPart("file_name", new StringBody(fileName));
        jsonObject.put("" + i, Fullpath);
    }

}

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Используя приведенный ниже код, я решил свою проблему

for (int i = 0; i < Postdata.Attachment_Path.Count; i++)
                {
                    Mfdc = new MultipartFormDataContent();
                    StorageFile sfs = await StorageFile.GetFileFromPathAsync(Postdata.Attachment_Path[i]);
                     await Task.Run(async () => {
                         FileStream fs = File.OpenRead(sfs.Path);
                         var streamContent = new StreamContent(fs);
                         var imageContent = new ByteArrayContent(streamContent.ReadAsByteArrayAsync().Result);
                         imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/jpeg");
                         form.Add(imageContent, i.ToString(), Postdata.Attached_filename[i]);
                     });
                }  
0 голосов
/ 02 октября 2018

Если вы хотите загрузить изображение на сервер, вам не нужно конвертировать изображение в байтовый массив, вы можете просто загрузить изображение, предоставив HTTP-контент, который использует поток, используя класс HttpStreamContent в Windows.Web.Http Пространство имен.Вот пример кода, который вы можете попробовать в своем приложении.

    //using Windows.Web.Http.HttpClient 
    public async Task<bool> ShareStatusWithPicture(string text, StorageFile file)
    {
        Windows.Web.Http.HttpClient client = new Windows.Web.Http.HttpClient();
        var fileContent = new HttpStreamContent(await file.OpenAsync(FileAccessMode.Read));
        fileContent.Headers.Add("Content-Type", "multipart/form-data");

        var content = new HttpMultipartFormDataContent();
        Uri uri = new Uri("URI of your server");
        content.Add(fileContent, "pic", file.Name);
        content.Add(new HttpStringContent(tokens.AccessToken), "access_token");
        content.Add(new HttpStringContent("homework"), "status");
        //TO DO 
        //Add other HttpStringContent
        Windows.Web.Http.HttpResponseMessage msg = await client.PostAsync(uri, content);
        client.Dispose();
        return msg.IsSuccessStatusCode;
    }

--- Update ---

Вы можете попробовать следующий код, чтобы преобразовать ваше изображение в bytearray:

for (int i = 0; i < homeWork.attachmentspath.Count; i++)
{
    Mfdc = new MultipartFormDataContent();
    StorageFile sfs = await StorageFile.GetFileFromPathAsync(homeWork.attachmentspath[i]);
    FileStream fileStream = null;
    byte[] imageByteArray = null;
    using (var stream = await sfs.OpenReadAsync())
    {
        imageByteArray = new byte[stream.Size];
        using (var reader = new DataReader(stream))
        {
            await reader.LoadAsync((uint)stream.Size);
            // Keep reading until we consume the complete stream.
            while (reader.UnconsumedBufferLength > 0)
            {
                uint bytesToRead = reader.ReadUInt32();
                reader.ReadBytes(imageByteArray);
            }
        }
    }

Если этот код по-прежнему не работает, вы можете использовать метод Stream.CopyTo , а затем преобразовать скопированный поток в массив.

for (int i = 0; i < homeWork.attachmentspath.Count; i++)
{
    Mfdc = new MultipartFormDataContent();
    StorageFile sfs = await StorageFile.GetFileFromPathAsync(homeWork.attachmentspath[i]);
    FileStream fileStream = null;
    byte[] imageByteArray = null;
    using (var stream = await sfs.OpenReadAsync())
    {
        //imageByteArray = new byte[stream.Size];
        using (MemoryStream ms = new MemoryStream())
        {
            stream.AsStream().CopyTo(ms);
            imageByteArray= ms.ToArray();
        }
    }
...