কোনও রিসফুল ওয়েব সার্ভিসে কোনও ফাইল এবং সহযোগী ডেটা পোস্ট করা પ્રાધાનিকভাবে জেএসএন হিসাবে


756

এটি সম্ভবত একটি মূ .় প্রশ্ন হতে চলেছে তবে আমি সেই রাতের মধ্যে একটি করছি। একটি অ্যাপ্লিকেশনটিতে আমি RESTful API বিকাশ করছি এবং আমরা ক্লায়েন্টটি JSON হিসাবে ডেটা প্রেরণ করতে চাই। এই অ্যাপ্লিকেশনটির অংশটির জন্য ক্লায়েন্টকে কোনও ফাইল (সাধারণত একটি চিত্র) পাশাপাশি চিত্র সম্পর্কিত তথ্য আপলোড করা প্রয়োজন।

একক অনুরোধে কীভাবে এটি ঘটে তা সন্ধান করতে আমার খুব কষ্ট হচ্ছে। JSON স্ট্রিংয়ে ফাইল ডেটা বেস 64 করা কি সম্ভব? আমি কি সার্ভারে 2 টি পোস্ট করতে পারি? আমি কি এই জন্য JSON ব্যবহার করা উচিত নয়?

পার্শ্ব নোট হিসাবে, আমরা ব্যাকএন্ডে গ্রেইস ব্যবহার করছি এবং এর মধ্যে যদি কোনও পার্থক্য হয় তবে এই পরিষেবাগুলি স্থানীয় মোবাইল ক্লায়েন্ট (আইফোন, অ্যান্ড্রয়েড, ইত্যাদি) দ্বারা অ্যাক্সেস করা হয়।


1
সুতরাং, এটি করার সর্বোত্তম উপায় কী?
জেমস 111

3
জেএসএনের পরিবর্তে ইউআরএল কোয়েরি স্ট্রিংয়ে মেটাডেটা প্রেরণ করুন।
জেআরসি

উত্তর:


632

আমি এখানে একটি অনুরূপ প্রশ্ন জিজ্ঞাসা:

আমি কীভাবে কোনও আরএসটি ওয়েব পরিষেবা ব্যবহার করে মেটাডেটা যুক্ত একটি ফাইল আপলোড করব?

আপনার মূলত তিনটি পছন্দ রয়েছে:

  1. বেস 64 ফাইলের এনকোড করে ডেটা আকার প্রায় 33% বাড়িয়ে ব্যয় করে এবং সার্ভার এবং ক্লায়েন্ট উভয়ই এনকোডিং / ডিকোডিংয়ের জন্য প্রসেসিং ওভারহেড যুক্ত করে।
  2. পোষ্টে প্রথমে ফাইলটি প্রেরণ করুন multipart/form-dataএবং ক্লায়েন্টকে একটি আইডি ফিরিয়ে দিন। ক্লায়েন্ট তারপরে আইডি সহ মেটাডেটা প্রেরণ করে এবং সার্ভারটি ফাইল এবং মেটাডেটা পুনরায় সংযুক্ত করে।
  3. প্রথমে মেটাডেটা প্রেরণ করুন এবং ক্লায়েন্টকে একটি আইডি ফিরিয়ে দিন। ক্লায়েন্ট তারপরে আইডি সহ ফাইলটি প্রেরণ করে এবং সার্ভারটি ফাইল এবং মেটাডেটা পুনরায় সংযুক্ত করে।

29
যদি আমি বিকল্প 1 পছন্দ করে থাকি, তবে আমি কি কেবল জেএসএন স্ট্রিংয়ের ভিতরে বেস 64 সামগ্রী অন্তর্ভুক্ত করব? {ফাইল: '234JKFDS # $ @ # $ এমএফডিডিএমএস ....', নাম: 'কিছু নাম' ...} নাকি এর থেকে আরও কিছু আছে?
গ্রেগ

15
গ্রেগ, ঠিক যেমনটি আপনি বলেছেন, আপনি এটি কেবল একটি সম্পত্তি হিসাবে অন্তর্ভুক্ত করবেন এবং মানটি হবে বেস বেস-এনকোড স্ট্রিং। এটি সম্ভবত সবচেয়ে সহজ পদ্ধতি সঙ্গে যেতে পারে তবে এটি ফাইলের আকারের উপর নির্ভর করে ব্যবহারিক নাও হতে পারে। উদাহরণস্বরূপ, আমাদের অ্যাপ্লিকেশনটির জন্য, আমাদের প্রতিটি আইফোন চিত্র পাঠাতে হবে যা প্রতিটি 2-3 এমবি are 33% বৃদ্ধি গ্রহণযোগ্য নয়। যদি আপনি কেবল 20KB ছোট ছবি পাঠাচ্ছেন তবে ওভারহেডটি আরও গ্রহণযোগ্য হতে পারে।
ড্যানিয়েল টি।

19
আমার আরও উল্লেখ করা উচিত যে বেস 64 এনকোডিং / ডিকোডিংয়ে কিছু প্রক্রিয়াজাত সময়ও লাগবে। এটি করা সবচেয়ে সহজ জিনিস হতে পারে তবে এটি অবশ্যই সেরা নয়।
ড্যানিয়েল টি।

8
বেস 64 নিয়ে জসন? হুম .. আমি বহুগুণ / ফর্মের সাথে লেগে থাকার বিষয়ে ভাবছি
সর্বব্যাপী

11
কেন এক অনুরোধে মাল্টিপার্ট / ফর্ম-ডেটা ব্যবহার করতে অস্বীকার করা হচ্ছে?
1nstinct

107

আপনি মাল্টিপার্ট / ফর্ম-ডেটা সামগ্রীর ধরণটি ব্যবহার করে এক অনুরোধের মাধ্যমে ফাইল এবং ডেটা প্রেরণ করতে পারেন :

অনেক অ্যাপ্লিকেশনগুলিতে কোনও ব্যবহারকারীর পক্ষে একটি ফর্ম উপস্থাপন করা সম্ভব। ব্যবহারকারী ফর্ম পূরণ করবে, টাইপ করা, ব্যবহারকারীর ইনপুট দ্বারা উত্পাদিত তথ্য, বা ব্যবহারকারীরা নির্বাচন করেছেন এমন ফাইল থেকে অন্তর্ভুক্ত। ফর্মটি পূরণ করা হয়ে গেলে, ফর্মটি থেকে প্রাপ্ত তথ্যটি ব্যবহারকারীর কাছ থেকে গ্রহণের আবেদনটিতে প্রেরণ করা হয়।

মাল্টিপার্ট / ফর্ম-ডেটা সংজ্ঞা সেই অ্যাপ্লিকেশনগুলির মধ্যে একটি থেকে উদ্ভূত ...

Http://www.faqs.org/rfcs/rfc2388.html থেকে :

"মাল্টিপার্ট / ফর্ম-ডেটা" অংশগুলির একটি সিরিজ ধারণ করে। প্রতিটি অংশে একটি বিষয়বস্তু-বিশৃঙ্খলা শিরোনাম [আরএফসি 2183] থাকতে পারে যেখানে ডিসপোজের ধরণটি "ফর্ম-ডেটা" থাকে এবং যেখানে প্রদর্শনীতে "নাম" এর একটি (অতিরিক্ত) পরামিতি থাকে, যেখানে সেই প্যারামিটারটির মানটি মূল হয় ফর্মের ক্ষেত্রের নাম। উদাহরণস্বরূপ, একটি অংশে একটি শিরোনাম থাকতে পারে:

সামগ্রী-বিভাজন: ফর্ম-ডেটা; নাম = "ব্যবহারকারী"

"ব্যবহারকারী" ক্ষেত্রের প্রবেশের সাথে সম্পর্কিত মান সহ।

সীমাগুলির মধ্যে প্রতিটি বিভাগের মধ্যে আপনি ফাইলের তথ্য বা ক্ষেত্রের তথ্য অন্তর্ভুক্ত করতে পারেন। আমি সাফল্যের সাথে একটি RESTful পরিষেবা কার্যকর করেছি যাতে ব্যবহারকারীর ডেটা এবং ফর্ম উভয়ই জমা দিতে হবে এবং মাল্টিপার্ট / ফর্ম-ডেটা পুরোপুরি কাজ করেছিল। পরিষেবাটি জাভা / স্প্রিং ব্যবহার করে নির্মিত হয়েছিল, এবং ক্লায়েন্টটি সি # ব্যবহার করছিল, সুতরাং দুর্ভাগ্যক্রমে আমার কাছে পরিষেবা সেট আপ করার পদ্ধতি সম্পর্কিত কোনও গ্রিলের উদাহরণ নেই। প্রতিটি "ফর্ম-ডেটা" বিভাগ আপনাকে প্যারামিটারের নাম এবং এর মান নির্দিষ্ট করার জন্য একটি জায়গা সরবরাহ করার কারণে আপনাকে এই ক্ষেত্রে JSON ব্যবহার করার দরকার নেই।

মাল্টিপার্ট / ফর্ম-ডেটা ব্যবহার সম্পর্কে ভাল কথাটি হ'ল আপনি HTTP- সংজ্ঞায়িত শিরোনাম ব্যবহার করছেন, সুতরাং আপনি আপনার পরিষেবা তৈরির জন্য বিদ্যমান HTTP সরঞ্জামগুলি ব্যবহারের বিশদ দর্শনের সাথে স্টিক করছেন।


1
ধন্যবাদ, তবে আমার প্রশ্নটি অনুরোধের জন্য জেএসওএন ব্যবহার করতে চাওয়ার উপর দৃষ্টি নিবদ্ধ করেছিল এবং যদি এটি সম্ভব হয়। আমি ইতিমধ্যে জানি যে আপনার প্রস্তাব অনুসারে আমি এটি প্রেরণ করতে পারি।
গ্রেগ

15
হ্যাঁ এটাই মূলত আমার প্রতিক্রিয়া "" আমি কি এর জন্য জেএসএন ব্যবহার করা উচিত নয়? " আপনি ক্লায়েন্টটি JSON ব্যবহার করার জন্য কেন একটি নির্দিষ্ট কারণ আছে?
ম্যাকস্ট্রেচ

3
সম্ভবত ব্যবসায়ের প্রয়োজনীয়তা বা ধারাবাহিকতা বজায় রাখা। অবশ্যই, করণীয় আদর্শ বিষয় হ'ল কনটেন্ট-টাইপ HTTP শিরোনামের ভিত্তিতে (ফর্ম ডেটা এবং জেএসএন প্রতিক্রিয়া) উভয়ই গ্রহণ করুন।
ড্যানিয়েল টি।

2
JSON নির্বাচন করা ক্লায়েন্ট এবং সার্ভার উভয় পক্ষেই অনেক বেশি মার্জিত কোডের ফলাফল দেয় যা কম সম্ভাব্য ত্রুটিগুলি বাড়ে। ফর্ম তথ্য তাই গতকাল।
superarts.org

5
আমি যদি কিছু বলি তা জন্য আমি ক্ষমা চাইছি। নেট বিকাশকারীর অনুভূতি। যদিও ইংরেজি আমার মাতৃভাষা নয়, প্রযুক্তি সম্পর্কে নিজেই অসভ্য কিছু বলতে আমার পক্ষে এটি বৈধ অজুহাত নয়। ফর্ম ডেটা ব্যবহার করা দুর্দান্ত এবং আপনি যদি এটির ব্যবহার চালিয়ে যান তবে আপনি আরও ভয়ঙ্কর হয়ে উঠবেন!
superarts.org

53

আমি জানি যে এই থ্রেডটি বেশ পুরানো, তবে আমি এখানে একটি বিকল্প অনুপস্থিত। আপনি যদি মেটাডেটা (যে কোনও বিন্যাসে) আপলোড করার জন্য ডেটা সহ প্রেরণ করতে চান তবে আপনি একটি একক multipart/relatedঅনুরোধ করতে পারেন ।

মাল্টিপার্ট / সম্পর্কিত মিডিয়া প্রকারটি বিভিন্ন আন্তঃ সম্পর্কিত দেহের অংশগুলি সমন্বিত যৌগিক সামগ্রীগুলির জন্য উদ্দিষ্ট।

আপনি আরও গভীরতার জন্য বিশদ বিবরণ জন্য আরএফসি 2387 স্পেসিফিকেশন চেক করতে পারেন ।

মূলত এই জাতীয় অনুরোধের প্রতিটি অংশে বিভিন্ন ধরণের সামগ্রী থাকতে পারে এবং সমস্ত অংশ কোনও না কোনওভাবে সম্পর্কিত (যেমন একটি চিত্র এবং এটি মেটাডেটা)। অংশগুলি একটি সীমানা স্ট্রিং দ্বারা চিহ্নিত করা হয়, এবং চূড়ান্ত সীমানা স্ট্রিং দুটি হাইফেন অনুসরণ করে।

উদাহরণ:

POST /upload HTTP/1.1
Host: www.hostname.com
Content-Type: multipart/related; boundary=xyz
Content-Length: [actual-content-length]

--xyz
Content-Type: application/json; charset=UTF-8

{
    "name": "Sample image",
    "desc": "...",
    ...
}

--xyz
Content-Type: image/jpeg

[image data]
[image data]
[image data]
...
--foo_bar_baz--

আমি আপনার সমাধানটি এখন পর্যন্ত সবচেয়ে ভাল পছন্দ করেছি। দুর্ভাগ্যক্রমে, ব্রাউজারে mutlipart / সম্পর্কিত অনুরোধ তৈরি করার কোনও উপায় নেই বলে মনে হয়।
পেটর বাউদিস

আপনার সাথে ক্লায়েন্টদের (বিশেষত জেএস সদস্যদের)
এপিআইয়ের

দুর্ভাগ্যক্রমে, পিএইচপি (7.2.1) তে এই ধরণের ডেটার জন্য বর্তমানে কোনও পাঠক নেই এবং আপনাকে নিজের পার্সার তৈরি করতে হবে
শিশির

এটি দুঃখজনক যে সার্ভার এবং ক্লায়েন্টদের পক্ষে এর জন্য ভাল সমর্থন নেই।
নাদের ঘানবাড়ি

14

আমি জানি এই প্রশ্নটি পুরানো, তবে শেষ দিনগুলিতে এই একই প্রশ্নের সমাধানের জন্য আমি পুরো ওয়েব অনুসন্ধান করেছিলাম। আমার কাছে গ্রেইস আরআরএসটি ওয়েব সার্ভিস এবং আইফোন ক্লায়েন্ট রয়েছে যা ছবি, শিরোনাম এবং বিবরণ প্রেরণ করে।

আমি জানি না আমার পদ্ধতির সেরা কিনা, তবে এটি এত সহজ এবং সহজ।

আমি UIImagePickerController ব্যবহার করে একটি ছবি তুলি এবং ছবির ডেটা প্রেরণের জন্য অনুরোধের শিরোনাম ট্যাগ ব্যবহার করে NSData সার্ভারে প্রেরণ করি।

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"myServerAddress"]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:UIImageJPEGRepresentation(picture, 0.5)];
[request setValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"myPhotoTitle" forHTTPHeaderField:@"Photo-Title"];
[request setValue:@"myPhotoDescription" forHTTPHeaderField:@"Photo-Description"];

NSURLResponse *response;

NSError *error;

[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

সার্ভারের পাশে, আমি কোডটি ব্যবহার করে ছবিটি পাই:

InputStream is = request.inputStream

def receivedPhotoFile = (IOUtils.toByteArray(is))

def photo = new Photo()
photo.photoFile = receivedPhotoFile //photoFile is a transient attribute
photo.title = request.getHeader("Photo-Title")
photo.description = request.getHeader("Photo-Description")
photo.imageURL = "temp"    

if (photo.save()) {    

    File saveLocation = grailsAttributes.getApplicationContext().getResource(File.separator + "images").getFile()
    saveLocation.mkdirs()

    File tempFile = File.createTempFile("photo", ".jpg", saveLocation)

    photo.imageURL = saveLocation.getName() + "/" + tempFile.getName()

    tempFile.append(photo.photoFile);

} else {

    println("Error")

}

ভবিষ্যতে আমার সমস্যা আছে কিনা তা আমি জানি না, তবে এখন উত্পাদন পরিবেশে ভাল কাজ করছে।


1
আমি এইচটিপি হেডার ব্যবহার করার এই বিকল্পটি পছন্দ করি। মেটাডেটা এবং স্ট্যান্ডার্ড এইচডিপি শিরোনামগুলির মধ্যে কিছু প্রতিসাম্য থাকলে এটি বিশেষত ভাল কাজ করে তবে আপনি অবশ্যই নিজের আবিষ্কার করতে পারেন own
ইজে ক্যাম্পবেল

14

এখানে আমার পদ্ধতির এপিআই (আমি উদাহরণটি ব্যবহার করি) - যেমন আপনি দেখতে পাচ্ছেন, আপনি file_idএপিআই-তে কোনও (সার্ভারে আপলোড করা ফাইল শনাক্তকারী) ব্যবহার করবেন না :

  1. photoসার্ভারে অবজেক্ট তৈরি করুন :

    POST: /projects/{project_id}/photos   
    body: { name: "some_schema.jpg", comment: "blah"}
    response: photo_id
  2. ফাইল আপলোড করুন (নোট যেটি fileএকক আকারে রয়েছে কারণ এটি প্রতি ছবিতে একমাত্র):

    POST: /projects/{project_id}/photos/{photo_id}/file
    body: file to upload
    response: -

এবং তারপরে উদাহরণস্বরূপ:

  1. ফটো তালিকা পড়ুন

    GET: /projects/{project_id}/photos
    response: [ photo, photo, photo, ... ] (array of objects)
  2. কিছু ছবির বিবরণ পড়ুন

    GET: /projects/{project_id}/photos/{photo_id}
    response: { id: 666, name: 'some_schema.jpg', comment:'blah'} (photo object)
  3. ফটো ফাইল পড়ুন

    GET: /projects/{project_id}/photos/{photo_id}/file
    response: file content

সুতরাং উপসংহারটি হ'ল, প্রথমে আপনি পোস্ট দ্বারা কোনও বস্তু (ফটো) তৈরি করেন এবং তারপরে আপনি ফাইলটির সাথে দ্বিতীয় অনুরোধটি প্রেরণ করেন (আবার পোস্ট করুন)।


3
এটি অর্জনের জন্য এটি আরও 'বিশ্রামের' মতো বলে মনে হচ্ছে।
জেমস ওয়েবস্টার

নবনির্মিত
সংস্থাগুলির

@ivanproskuryakov "অবশ্যই" কেন? উপরের উদাহরণে (2 বিন্দুতে পোষ্ট করুন) ফাইল আইডি অকেজো। দ্বিতীয় যুক্তি (পয়েন্ট ২-তে পোষ্টের জন্য) আমি একবচন ফর্ম '/ ফাইল' ('/ ফাইল' নয়) ব্যবহার করি তাই আইডি প্রয়োজন হয় না কারণ পথ: / প্রকল্পগুলি / 2 / ফটো / 3 / ফাইল পরিচয় ফটো ফাইলে সম্পূর্ণ তথ্য দেয়।
কামিল কিয়েসজেউস্কি

এইচটিটিপি প্রোটোকল নির্দিষ্টকরণ থেকে। w3.org/Protocols/rfc2616/rfc2616-sec10.html 10.2.2 201 তৈরি করা হয়েছে "সদ্য তৈরি হওয়া রিসোর্সটি ইউআরআই (গুলি) দ্বারা প্রতিক্রিয়ার সত্তায় ফিরে আসে, উত্স দ্বারা প্রদত্ত সংস্থানটির জন্য সর্বাধিক নির্দিষ্ট ইউআরআই দিয়ে একটি অবস্থান শিরোনাম ক্ষেত্র " @ কামিলকিএকজেউসকি (এক) এবং (দুজন) একসাথে পোষ্ট অপারেশন পোস্টে যুক্ত করা যেতে পারে: / প্রকল্পগুলি / {প্রজেক্ট_আইডি} / ফটো আপনার অবস্থানের শিরোনাম ফিরিয়ে দেবে, যা জিইটি একক ছবি (সংস্থান *) অপারেশনের জন্য ব্যবহার করা যেতে পারে জিইটি: পেতে সমস্ত বিবরণ সহ একক ছবি সিজিইটি: ফটোগুলির সমস্ত সংগ্রহ পেতে
ইভান প্রসকুরিয়াকভ

1
যদি মেটাডেটা এবং আপলোডগুলি পৃথক ক্রিয়াকলাপ হয়, তবে শেষ পয়েন্টগুলিতে এই সমস্যাগুলি রয়েছে: ফাইল আপলোডের জন্য পোষ্ট অপারেশন ব্যবহৃত হয় - পোষ্ট আদর্শ নয়। আপনি নতুন তৈরি না করেই রিসোর্স পরিবর্তন করছেন বলে অবশ্যই পুট (আইডেম্পোটেন্ট) ব্যবহার করা উচিত। REST নামক বস্তুগুলির সাথে কাজ করে রিসোর্স করে । পোস্ট: "../photos/" পুট: "../photos/{photo_id}" GET: "../photos/" GET: "../photos/{photo_id}" PS। পৃথক শেষ পয়েন্টে আপলোডকে পৃথক করা অনির্ধারিত আচরণের দিকে পরিচালিত করতে পারে। পুনঃপ্রতিদ্বন্দ্বী / বিহীন
ইভান প্রোস্কুরিয়াকভ

6

ফর্মডাটা অবজেক্টস: অ্যাজাক্স ব্যবহার করে ফাইলগুলি আপলোড করুন

এক্সএমএলএইচটিপিআরকোয়েস্ট স্তর 2 নতুন ফর্মডাটা ইন্টারফেসের জন্য সমর্থন যোগ করে। ফর্মডাটা অবজেক্টগুলি সহজেই কী / মান জোড়ার ফর্ম ক্ষেত্রগুলি এবং তাদের মানগুলি উপস্থাপন করে এমন একটি সেট তৈরি করার একটি উপায় সরবরাহ করে যা এক্সএমএলএইচটিপিআরকোস্ট প্রেরণ () পদ্ধতি ব্যবহার করে সহজেই প্রেরণ করা যায়।

function AjaxFileUpload() {
    var file = document.getElementById("files");
    //var file = fileInput;
    var fd = new FormData();
    fd.append("imageFileData", file);
    var xhr = new XMLHttpRequest();
    xhr.open("POST", '/ws/fileUpload.do');
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
             alert('success');
        }
        else if (uploadResult == 'success')
             alert('error');
    };
    xhr.send(fd);
}

https://developer.mozilla.org/en-US/docs/Web/API/FormData


6

যেহেতু একমাত্র অনুপস্থিত উদাহরণটি এন্ড্রয়েড উদাহরণ , আমি এটি যুক্ত করব। এই কৌশলটি একটি কাস্টম AsyncTask ব্যবহার করে যা আপনার ক্রিয়াকলাপ শ্রেণীর মধ্যে ঘোষণা করা উচিত।

private class UploadFile extends AsyncTask<Void, Integer, String> {
    @Override
    protected void onPreExecute() {
        // set a status bar or show a dialog to the user here
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        // progress[0] is the current status (e.g. 10%)
        // here you can update the user interface with the current status
    }

    @Override
    protected String doInBackground(Void... params) {
        return uploadFile();
    }

    private String uploadFile() {

        String responseString = null;
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost("http://example.com/upload-file");

        try {
            AndroidMultiPartEntity ampEntity = new AndroidMultiPartEntity(
                new ProgressListener() {
                    @Override
                        public void transferred(long num) {
                            // this trigger the progressUpdate event
                            publishProgress((int) ((num / (float) totalSize) * 100));
                        }
            });

            File myFile = new File("/my/image/path/example.jpg");

            ampEntity.addPart("fileFieldName", new FileBody(myFile));

            totalSize = ampEntity.getContentLength();
            httpPost.setEntity(ampEntity);

            // Making server call
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();

            int statusCode = httpResponse.getStatusLine().getStatusCode();
            if (statusCode == 200) {
                responseString = EntityUtils.toString(httpEntity);
            } else {
                responseString = "Error, http status: "
                        + statusCode;
            }

        } catch (Exception e) {
            responseString = e.getMessage();
        }
        return responseString;
    }

    @Override
    protected void onPostExecute(String result) {
        // if you want update the user interface with upload result
        super.onPostExecute(result);
    }

}

সুতরাং, আপনি যখন নিজের ফাইল আপলোড করতে চান কেবল কল করুন:

new UploadFile().execute();

হাই, অ্যান্ড্রয়েড মাল্টি পার্ট এন্টিটি কি দয়া করে ব্যাখ্যা করুন ... এবং যদি আমি পিডিএফ, শব্দ বা এক্সএলএস ফাইল আপলোড করতে চাই তবে আমাকে কিছু দিকনির্দেশনা দিন ... আমি এটিতে নতুন।
amit পান্ড্যা

1
@amitpandya আমি কোডটি একটি জেনেরিক ফাইল আপলোডে পরিবর্তন করেছি যাতে এটি পড়ার যে কারও কাছে এটি আরও স্পষ্ট
Lifeisfoo

2

আমি ব্যাকএন্ড সার্ভারে কিছু স্ট্রিং প্রেরণ করতে চেয়েছিলাম। আমি মাল্টিপার্ট দিয়ে জেসন ব্যবহার করিনি, আমি অনুরোধের প্যারাম ব্যবহার করেছি।

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void uploadFile(HttpServletRequest request,
        HttpServletResponse response, @RequestParam("uuid") String uuid,
        @RequestParam("type") DocType type,
        @RequestParam("file") MultipartFile uploadfile)

ইউরাল দেখতে হবে

http://localhost:8080/file/upload?uuid=46f073d0&type=PASSPORT

আমি ফাইল আপলোডের সাথে দুটি প্যারাম (ইউউইড এবং টাইপ) দিয়ে যাচ্ছি। আশা করি এর সাহায্যে যাদের পাঠাতে জটিল জসন ডেটা নেই।


1

আপনি https://square.github.io/okhttp/ লাইব্রেরি ব্যবহার করে দেখতে পারেন । আপনি অনুরোধের বডিটি মাল্টিপার্ট করার জন্য সেট করতে পারেন এবং তারপরে ফাইল এবং জেসন অবজেক্টগুলি আলাদাভাবে যুক্ত করতে পারেন:

MultipartBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("uploadFile", uploadFile.getName(), okhttp3.RequestBody.create(uploadFile, MediaType.parse("image/png")))
                .addFormDataPart("file metadata", json)
                .build();

        Request request = new Request.Builder()
                .url("https://uploadurl.com/uploadFile")
                .post(requestBody)
                .build();

        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

            logger.info(response.body().string());

0
@RequestMapping(value = "/uploadImageJson", method = RequestMethod.POST)
    public @ResponseBody Object jsongStrImage(@RequestParam(value="image") MultipartFile image, @RequestParam String jsonStr) {
-- use  com.fasterxml.jackson.databind.ObjectMapper convert Json String to Object
}

-5

আপনি নিম্নলিখিত আমদানি আছে তা নিশ্চিত করুন। অবশ্যই অন্যান্য স্ট্যান্ডার্ড আমদানি

import org.springframework.core.io.FileSystemResource


    void uploadzipFiles(String token) {

        RestBuilder rest = new RestBuilder(connectTimeout:10000, readTimeout:20000)

        def zipFile = new File("testdata.zip")
        def Id = "001G00000"
        MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>()
        form.add("id", id)
        form.add('file',new FileSystemResource(zipFile))
        def urld ='''http://URL''';
        def resp = rest.post(urld) {
            header('X-Auth-Token', clientSecret)
            contentType "multipart/form-data"
            body(form)
        }
        println "resp::"+resp
        println "resp::"+resp.text
        println "resp::"+resp.headers
        println "resp::"+resp.body
        println "resp::"+resp.status
    }

1
এটি পানjava.lang.ClassCastException: org.springframework.core.io.FileSystemResource cannot be cast to java.lang.String
মারিয়ানো রুইজ 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.