কখনও কখনও জেব এবং জেনসের উত্তরগুলি কার্যকর হয় না এবং বাতিল হয় না। এই ক্ষেত্রে আমি অনুসরণ সমাধান ব্যবহার। ফাইলের প্রধানটিতে সাধারণত স্বাক্ষর টাইপ থাকে। আমি এটি পড়েছি এবং স্বাক্ষরগুলির তালিকাতে পরিচিতের সাথে তুলনা করি ।
/**
*
* @param is InputStream on start of file. Otherwise signature can not be defined.
* @return int id of signature or -1, if unknown signature was found. See SIGNATURE_ID_(type) constants to
* identify signature by its id.
* @throws IOException in cases of read errors.
*/
public static int getSignatureIdFromHeader(InputStream is) throws IOException {
// read signature from head of source and compare with known signatures
int signatureId = -1;
int sigCount = SIGNATURES.length;
int[] byteArray = new int[MAX_SIGNATURE_LENGTH];
StringBuilder builder = new StringBuilder();
for (int i = 0; i < MAX_SIGNATURE_LENGTH; i++) {
byteArray[i] = is.read();
builder.append(Integer.toHexString(byteArray[i]));
}
if (DEBUG) {
Log.d(TAG, "head bytes=" + builder.toString());
}
for (int i = 0; i < MAX_SIGNATURE_LENGTH; i++) {
// check each bytes with known signatures
int bytes = byteArray[i];
int lastSigId = -1;
int coincidences = 0;
for (int j = 0; j < sigCount; j++) {
int[] sig = SIGNATURES[j];
if (DEBUG) {
Log.d(TAG, "compare" + i + ": " + Integer.toHexString(bytes) + " with " + sig[i]);
}
if (bytes == sig[i]) {
lastSigId = j;
coincidences++;
}
}
// signature is unknown
if (coincidences == 0) {
break;
}
// if first bytes of signature is known we check signature for full coincidence
if (coincidences == 1) {
int[] sig = SIGNATURES[lastSigId];
int sigLength = sig.length;
boolean isSigKnown = true;
for (; i < MAX_SIGNATURE_LENGTH && i < sigLength; i++) {
bytes = byteArray[i];
if (bytes != sig[i]) {
isSigKnown = false;
break;
}
}
if (isSigKnown) {
signatureId = lastSigId;
}
break;
}
}
return signatureId;
}
signatureId
স্বাক্ষরের অ্যারেতে স্বাক্ষরের সূচক। উদাহরণ স্বরূপ,
private static final int[] SIGNATURE_PNG = hexStringToIntArray("89504E470D0A1A0A");
private static final int[] SIGNATURE_JPEG = hexStringToIntArray("FFD8FF");
private static final int[] SIGNATURE_GIF = hexStringToIntArray("474946");
public static final int SIGNATURE_ID_JPEG = 0;
public static final int SIGNATURE_ID_PNG = 1;
public static final int SIGNATURE_ID_GIF = 2;
private static final int[][] SIGNATURES = new int[3][];
static {
SIGNATURES[SIGNATURE_ID_JPEG] = SIGNATURE_JPEG;
SIGNATURES[SIGNATURE_ID_PNG] = SIGNATURE_PNG;
SIGNATURES[SIGNATURE_ID_GIF] = SIGNATURE_GIF;
}
এখন আমার ফাইল টাইপ আছে এমনকি যদি ফাইলের ইউআরআই না থাকে। পরবর্তী আমি ফাইল টাইপ দ্বারা মাইম টাইপ পেতে। কোন মাইম টাইপটি পেতে হবে তা যদি আপনি না জানেন তবে আপনি এই টেবিলটিতে সঠিকটি পেতে পারেন ।
এটি অনেক ধরণের ফাইলের জন্য কাজ করে। তবে ভিডিওর জন্য এটি কাজ করে না, কারণ মাইম টাইপ পাওয়ার জন্য আপনাকে ভিডিও কোডেক জানা দরকার। ভিডিওর মাইম টাইপ পেতে আমি মিডিয়ামেটাডাটা রিটারিভার ব্যবহার করি ।