143 lines
4.0 KiB
Kotlin
143 lines
4.0 KiB
Kotlin
package com.cubetiqs.web.modules.uploader
|
|
|
|
import com.cubetiqs.web.modules.file.FileStorageFactory
|
|
import com.fasterxml.jackson.annotation.JsonIgnore
|
|
import org.hibernate.Hibernate
|
|
import org.springframework.data.annotation.CreatedDate
|
|
import org.springframework.data.annotation.LastModifiedDate
|
|
import org.springframework.data.jpa.domain.support.AuditingEntityListener
|
|
import org.springframework.web.multipart.MultipartFile
|
|
import java.io.File
|
|
import java.io.InputStream
|
|
import java.io.Serializable
|
|
import java.util.*
|
|
import javax.persistence.*
|
|
|
|
@UploaderModule
|
|
@Entity
|
|
@Table(name = "uploader")
|
|
@EntityListeners(AuditingEntityListener::class)
|
|
open class UploaderEntity(
|
|
@Id
|
|
@GeneratedValue(strategy = GenerationType.AUTO)
|
|
open var id: UUID? = null,
|
|
|
|
@Column(name = "filename")
|
|
open var filename: String? = null,
|
|
|
|
@Column(name = "content_type")
|
|
open var contentType: String? = null,
|
|
|
|
@Column(name = "content_length")
|
|
open var contentLength: Long? = null,
|
|
|
|
@Column(name = "path", length = 300)
|
|
open var path: String? = null,
|
|
|
|
@Temporal(TemporalType.TIMESTAMP)
|
|
@Column(name = "created_at")
|
|
@CreatedDate
|
|
open var createdAt: Date? = null,
|
|
|
|
@Temporal(TemporalType.TIMESTAMP)
|
|
@Column(name = "updated_at")
|
|
@LastModifiedDate
|
|
open var updatedAt: Date? = null,
|
|
|
|
@Column(length = 30)
|
|
open var providerType: String? = null,
|
|
) : Serializable {
|
|
@Transient
|
|
@JsonIgnore
|
|
private var partFile: MultipartFile? = null
|
|
|
|
@Transient
|
|
@JsonIgnore
|
|
private var file: File? = null
|
|
|
|
@Transient
|
|
fun isFileExists(): Boolean {
|
|
val temp = getFile()
|
|
return temp?.exists() ?: false
|
|
}
|
|
|
|
@Transient
|
|
@JsonIgnore
|
|
fun getFile(): File? {
|
|
if (file == null) {
|
|
file = File(path ?: return null)
|
|
}
|
|
return file
|
|
}
|
|
|
|
override fun equals(other: Any?): Boolean {
|
|
if (this === other) return true
|
|
if (other == null || Hibernate.getClass(this) != Hibernate.getClass(other)) return false
|
|
other as UploaderEntity
|
|
|
|
return id != null && id == other.id
|
|
}
|
|
|
|
override fun hashCode(): Int = javaClass.hashCode()
|
|
|
|
companion object {
|
|
fun fromFile(file: MultipartFile): UploaderEntity {
|
|
// transfer to file storage first
|
|
val store = FileStorageFactory.store(file)
|
|
val uploader = UploaderEntity()
|
|
uploader.partFile = file
|
|
uploader.providerType = "local"
|
|
uploader.filename = file.originalFilename
|
|
uploader.contentType = file.contentType
|
|
uploader.contentLength = file.size
|
|
uploader.path = store.shortPath
|
|
return uploader
|
|
}
|
|
|
|
fun fromUploader(uploader: UploaderEntity): MultipartFile? {
|
|
if (uploader.partFile != null) {
|
|
return uploader.partFile
|
|
}
|
|
|
|
val file = try {
|
|
File(uploader.path!!)
|
|
} catch (ex: Exception) {
|
|
null
|
|
} ?: return null
|
|
|
|
return object : MultipartFile {
|
|
override fun getInputStream(): InputStream {
|
|
return file.inputStream()
|
|
}
|
|
|
|
override fun getName(): String {
|
|
return file.name
|
|
}
|
|
|
|
override fun getOriginalFilename(): String? {
|
|
return uploader.filename
|
|
}
|
|
|
|
override fun getContentType(): String? {
|
|
return uploader.contentType
|
|
}
|
|
|
|
override fun isEmpty(): Boolean {
|
|
return file.length() == 0L
|
|
}
|
|
|
|
override fun getSize(): Long {
|
|
return file.length()
|
|
}
|
|
|
|
override fun getBytes(): ByteArray {
|
|
return file.readBytes()
|
|
}
|
|
|
|
override fun transferTo(dest: File) {
|
|
file.copyTo(dest)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |