Files
contractor/upload.cfm
T

152 lines
9.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<cfsetting showdebugoutput="no" enablecfoutputonly="true">
<cfheader name="Content-Type" value="application/json; charset=utf-8">
<cfheader name="Access-Control-Allow-Origin" value="*">
<cfheader name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS">
<cfheader name="Access-Control-Allow-Headers" value="Content-Type">
<cfif cgi.request_method EQ "OPTIONS">
<cfoutput>OK</cfoutput><cfabort>
</cfif>
<cfset result = {ok: false, error: "no file"}>
<cftry>
<cfset ct = cgi.http_content_type>
<!--- Form-encoded: filename=&data=&contract_id= (iframe) --->
<cfif structKeyExists(form, "filename") AND structKeyExists(form, "data")>
<cfset clientFile = form.filename>
<cfset originalBytes = form.data>
<cfset contractId = structKeyExists(form, "contract_id") ? form.contract_id : "">
<cfset mime = "application/octet-stream">
<cfset ext = listLast(clientFile, ".")>
<cfif ext EQ "pdf"><cfset mime = "application/pdf">
<cfelseif ext EQ "docx"><cfset mime = "application/vnd.openxmlformats-officedocument.wordprocessingml.document">
<cfelseif ext EQ "doc"><cfset mime = "application/msword">
<cfelseif ext EQ "zip"><cfset mime = "application/zip">
</cfif>
<cftransaction>
<cfquery datasource="baza">
INSERT INTO documents (filename, mime_type, original_bytes, status) VALUES (<cfqueryparam value="#clientFile#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#mime#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#originalBytes#" cfsqltype="cf_sql_varchar">,'uploaded')
</cfquery>
<cfquery name="doc" datasource="baza">
SELECT id FROM documents WHERE filename=<cfqueryparam value="#clientFile#" cfsqltype="cf_sql_varchar"> AND status='uploaded' ORDER BY created_at DESC LIMIT 1
</cfquery>
<cfif len(contractId)>
<cfset suppType = "additional">
<cfelse>
<cfquery datasource="baza">
INSERT INTO contracts (number, client) VALUES (<cfqueryparam value="б/н #dateFormat(now(),'yyyymmdd')#-#timeFormat(now(),'HHmm')#" cfsqltype="cf_sql_varchar">,'')
</cfquery>
<cfquery name="cid" datasource="baza">
SELECT id FROM contracts ORDER BY created_at DESC LIMIT 1
</cfquery>
<cfset contractId = cid.id>
<cfset suppType = "initial">
</cfif>
<cfquery datasource="baza">
INSERT INTO supplements (contract_id, document_id, type) VALUES (<cfqueryparam value="#contractId#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#doc.id#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#suppType#" cfsqltype="cf_sql_varchar">)
</cfquery>
</cftransaction>
<cfset result = {ok: true, contract_id: contractId, doc_id: doc.id, filename: clientFile, size: len(originalBytes)}>
<!--- JSON: {filename, data} или {files: [...]} --->
<cfelseif ct CONTAINS "application/json">
<cfset body = toString(getHttpRequestData().content)>
<cfset data = deserializeJSON(body)>
<cfif structKeyExists(data, "files") AND isArray(data.files)>
<cfset fileList = data.files>
<cfelseif structKeyExists(data, "filename")>
<cfset fileList = [data]>
<cfelse>
<cfset result = {ok: false, error: "JSON: filename required"}>
<cfoutput>#serializeJSON(result)#</cfoutput><cfabort>
</cfif>
<cfset contractId = structKeyExists(data, "contract_id") ? data.contract_id : "">
<!--- Фоновая обработка — мгновенный ответ --->
<cfset fileListJson = serializeJSON(fileList)>
<cfthread action="run" name="up_#createUUID()#" flj="#fileListJson#" cid="#contractId#">
<cfset var fileList = deserializeJSON(flj)>
<cfset var contractId = cid>
<cfloop array="#fileList#" index="var fdata">
<cftry>
<cfset var clientFile = fdata.filename>
<cfset var originalBytes = fdata.data>
<cfset var mime = "application/octet-stream">
<cfset var ext = listLast(clientFile, ".")>
<cfif ext EQ "pdf"><cfset mime = "application/pdf">
<cfelseif ext EQ "docx"><cfset mime = "application/vnd.openxmlformats-officedocument.wordprocessingml.document">
<cfelseif ext EQ "doc"><cfset mime = "application/msword">
<cfelseif ext EQ "zip"><cfset mime = "application/zip">
</cfif>
<cftransaction>
<cfquery datasource="baza">
INSERT INTO documents (filename, mime_type, original_bytes, status)
VALUES (<cfqueryparam value="#clientFile#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#mime#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#originalBytes#" cfsqltype="cf_sql_varchar">,'uploaded')
</cfquery>
<cfquery name="var doc" datasource="baza">
SELECT id FROM documents WHERE filename=<cfqueryparam value="#clientFile#" cfsqltype="cf_sql_varchar"> AND status='uploaded' ORDER BY created_at DESC LIMIT 1
</cfquery>
<cfif len(contractId)>
<cfset var suppType = "additional">
<cfelse>
<cfquery datasource="baza">
INSERT INTO contracts (number, client) VALUES (<cfqueryparam value="б/н #dateFormat(now(),'yyyymmdd')#-#timeFormat(now(),'HHmm')#" cfsqltype="cf_sql_varchar">,'')
</cfquery>
<cfquery name="var nc" datasource="baza">
SELECT id FROM contracts ORDER BY created_at DESC LIMIT 1
</cfquery>
<cfset contractId = nc.id>
<cfset var suppType = "initial">
</cfif>
<cfquery datasource="baza">
INSERT INTO supplements (contract_id, document_id, type) VALUES (<cfqueryparam value="#contractId#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#doc.id#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#suppType#" cfsqltype="cf_sql_varchar">)
</cfquery>
</cftransaction>
<cfcatch></cfcatch>
</cftry>
</cfloop>
</cfthread>
<cfset result = {ok: true, count: arrayLen(fileList), contract_id: contractId}>
<!--- Multipart: curl -F --->
<cfelseif structKeyExists(form, "files") AND len(form.files)>
<cffile action="upload" fileField="files" destination="#getTempDirectory()#" nameConflict="makeUnique" result="upload">
<cffile action="readBinary" file="#upload.serverDirectory#/#upload.serverFile#" variable="fileBytes">
<cfset mime = "application/octet-stream">
<cfset ext = listLast(upload.clientFile, ".")>
<cfif ext EQ "pdf"><cfset mime = "application/pdf">
<cfelseif ext EQ "docx"><cfset mime = "application/vnd.openxmlformats-officedocument.wordprocessingml.document">
<cfelseif ext EQ "doc"><cfset mime = "application/msword">
<cfelseif ext EQ "zip"><cfset mime = "application/zip">
</cfif>
<cfset contractId = structKeyExists(form, "contract_id") ? form.contract_id : "">
<cftransaction>
<cfquery datasource="baza">
INSERT INTO documents (filename, mime_type, original_bytes, status) VALUES (<cfqueryparam value="#upload.clientFile#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#mime#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#toBase64(fileBytes)#" cfsqltype="cf_sql_varchar">,'uploaded')
</cfquery>
<cfquery name="doc" datasource="baza">
SELECT id FROM documents WHERE filename=<cfqueryparam value="#upload.clientFile#" cfsqltype="cf_sql_varchar"> AND status='uploaded' ORDER BY created_at DESC LIMIT 1
</cfquery>
<cfif len(contractId)>
<cfset suppType = "additional">
<cfelse>
<cfquery datasource="baza">
INSERT INTO contracts (number, client) VALUES (<cfqueryparam value="б/н #dateFormat(now(),'yyyymmdd')#-#timeFormat(now(),'HHmm')#" cfsqltype="cf_sql_varchar">,'')
</cfquery>
<cfquery name="cid" datasource="baza">
SELECT id FROM contracts ORDER BY created_at DESC LIMIT 1
</cfquery>
<cfset contractId = cid.id>
<cfset suppType = "initial">
</cfif>
<cfquery datasource="baza">
INSERT INTO supplements (contract_id, document_id, type) VALUES (<cfqueryparam value="#contractId#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#doc.id#" cfsqltype="cf_sql_varchar">,<cfqueryparam value="#suppType#" cfsqltype="cf_sql_varchar">)
</cfquery>
</cftransaction>
<cfset result = {ok: true, contract_id: contractId, doc_id: doc.id, filename: upload.clientFile, size: upload.fileSize}>
</cfif>
<cfcatch>
<cfset result = {ok: false, error: cfcatch.message}>
</cfcatch>
</cftry>
<cfoutput>#serializeJSON(result)#</cfoutput>